2016-04-12 2 views
41

ドッカーどのように依存する子画像のリストを取得できますか?私は、画像を削除しようとしていると私は取得

# docker rmi f50f9524513f 
Failed to remove image (f50f9524513f): Error response from daemon: conflict: unable to delete f50f9524513f (cannot be forced) - image has dependent child images 

これは、ドッキングウィンドウのバージョンである:

# docker version 
Client: 
Version:  1.10.3 
API version: 1.22 
Go version: go1.5.3 
Git commit: 20f81dd 
Built:  Thu Mar 10 21:49:11 2016 
OS/Arch:  linux/amd64 

Server: 
Version:  1.10.3 
API version: 1.22 
Go version: go1.5.3 
Git commit: 20f81dd 
Built:  Thu Mar 10 21:49:11 2016 
OS/Arch:  linux/amd64 

が、余分な情報はありません。

# docker images --format="raw" | grep f50f9524513f -C3 

repository: debian 
tag: 8 
image_id: f50f9524513f 
created_at: 2016-03-01 18:51:14 +0000 UTC 
virtual_size: 125.1 MB 

repository: debian 
tag: jessie 
image_id: f50f9524513f 
created_at: 2016-03-01 18:51:14 +0000 UTC 
virtual_size: 125.1 MB 

どのようにすることができます私は従属の子画像を持っているとしますか?

そのイメージIDを持つ実行中または停止したコンテナはありません。

答えて

20

短い回答: Here is a python3 script依存ドッカーの画像が一覧表示されます。

長い答え: 次に問題の画像の後に作成されたすべての画像の画像IDと親IDを見ることができます:

docker inspect --format='{{.Id}} {{.Parent}}' \ 
    $(docker images --filter since=f50f9524513f --quiet) 

あなたは親IDを持つ画像を探すことができるはずですf50f9524513fで始まる、そしてこれら、の子の画像を探しなど。しかし.Parentisn’t what you think.、ほとんどの場合、あなたはその仕事をするために上記のdocker images --allを指定する必要がありますので、あなたはすべてのintermediaのための画像IDを取得しますte層も同様である。次のようにあなたがそれを呼び出すことができdesc.pyとしてこれを保存する場合は

#!/usr/bin/python3 
import sys 

def desc(image_ids, links): 
    if links: 
     link, *tail = links 
     if len(link) > 1: 
      image_id, parent_id = link 
      checkid = lambda i: parent_id.startswith(i) 
      if any(map(checkid, image_ids)): 
       return desc(image_ids | {image_id}, tail) 
     return desc(image_ids, tail) 
    return image_ids 


def gen_links(lines): 
    parseid = lambda s: s.replace('sha256:', '') 
    for line in reversed(list(lines)): 
     yield list(map(parseid, line.split())) 


if __name__ == '__main__': 
    image_ids = {sys.argv[1]} 
    links = gen_links(sys.stdin.readlines()) 
    trunc = lambda s: s[:12] 
    print('\n'.join(map(trunc, desc(image_ids, links)))) 

:ここ

は、ドッキングウィンドウの出力を解析し、画像のリストを生成するために検索を行うには、より限定されたのpython3スクリプトです

docker images \ 
    | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \ 
     $(docker images --all --quiet) \ 
     | python3 desc.py f50f9524513f) 

また、同じことを行うthe gist aboveを使用してください。

+1

どれも期待文字で始まらない場合はどうなりますか?それはバグの可能性を示していますか?私はDocker for Macのベータ版、FWIWにいるので、それは私を驚かないだろう。 – neverfox

+0

バグか、問題の画像に子がないことを意味します。 –

+2

これは本当に元の質問に答えるものではありません。これは、問題の画像の後に作成されたものを示します。これは、ポスターが削除しようとしていた画像に依存する場合としない場合があります。 Simon Bradyの答えは少なくとも少量のサンプルサイズの画像ではこのトリックを行います。 – penguincoder

21

あなたは画像の膨大な数を持っていない場合は、強引なアプローチが常にあります:

for i in $(docker images -q) 
do 
    docker history $i | grep -q f50f9524513f && echo $i 
done | sort -u 
+0

私はこれが「最良の」解決策だと思います。これを少し拡張して 'echo $ 1'を醜い(しかし依然としてブルート・フォーシー)' docker images |に変更することで、 grep $ i'(イメージIDに '--filter'フラグを使用するよりも、ドッカーバージョンで移植性があります) –

1

あなたはドッカー

の以下のディレクトリを通じて関係なく、親と子の関係のドッカー画像を削除することができます
/var/lib/docker/image/devicemapper/imagedb/content/sha256 

このディレクトリには、Docker画像がありますので、削除することができます。

+0

デバイスマッパーとドッカーエンジンを想定して、ドッカーAPIを使用して移植可能なコマンドを作成しようとしています(for docker swarm for例)これはポータブルではない解決策になります。また、他のプロセス(ドッカーデーモンを含む)がそれを使用している間に、ファイルシステム内のファイルを削除するのは危険です。 – nicocesar

+0

ここはどこですか? –

7

dockvizをインストールして、ツリービューで画像IDから枝に従ってください:

go get github.com/justone/dockviz 
$(go env GOPATH)/bin/dockviz images --tree -l 
+0

'sudo apt-get update;を実行すると良いでしょう。 sudo apt-get install golang-go; GOPATH = $ HOME/.go'を最初にエクスポートします。 – loretoparisi

0

これは私が本当に私の最後の「イメージ」(レイヤー、維持するために何をしたかである - 私を投げたものです私はちょうどドッカーのビルドに入っています)。

「...強制できません...」というメッセージが表示されていました。私は、「ドッカーコミット」によって作成された実際には独立したイメージではないので、私が必要としなかったイメージを削除できないことに気付きました。私の問題は、ベースイメージと最終イメージの間にいくつかのイメージ(またはレイヤー)があり、クリーンアップしようとしたのは、子と親についてのエラー/警告を受けた場所です。

  1. 最終画像(または、もしあれば)をtarballにエクスポートしました。
  2. 私は私の望むすべての画像を削除しました。私は最終結果を含めました。私はそれをタールボールに保存しました。私はそれを使うことができるかどうか分からず、実験していました。
  3. その後、「docker image load -i FinalImage.tar.gz」を実行しました。出力は次のようなものでした: 7d9b54235881:ローディングレイヤー[==================== ============>] 167.1MB/167.1MB c044b7095786:レイヤーの読み込み[===================== ================================================================================================== 20.89MB/20.89MB =========================> 42.05MB/42.05MB 19abaa1dc0d4:レイヤーの読み込み中[=========================================== =>] 37.96MB/37.96MB 4865d7b6fdb2:読み込みレイヤ[==================== ==============>] 169.6MB/169.6MB a0c115c7b87c:レイヤーを読み込む[===================== ===============> 132MB/132MB イメージID:sha256:82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

「docker image ls」と表示すると、元のベースイメージと、以前にtarballに保存した最終イメージのみが表示されます。

[ルート@ docker1〜] 82d4f8ef9ea1 3日前SIZE のhttpdインポートを作成した#]ドッキングウィンドウの画像LS リポジトリタグイメージID 747メガバイト CentOSのhttpdの36540f359ca3 5週間前に193メガバイト


私のシステムが 'クリーン' であります今。私は欲しいイメージしか持っていません。 問題なくベースイメージを削除しました。

[ルート@ docker1〜]#ドッキングウィンドウRMI 36540f359ca3 タグなし:CentOSの:httpdの タグなし:SHA256 @ CentOSの:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131 が削除された:SHA256:36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f

0

私はプリントアウトするシェルスクリプトでgistを作成しました誰かがbashソリューションに興味があるのであれば、誰でもbashソリューションに興味を持っているはずです。

#!/bin/bash 
parent_short_id=$1 
parent_id=`docker inspect --format '{{.Id}}' $1` 

get_kids() { 
    local parent_id=$1 
    docker inspect --format='ID {{.Id}} PAR {{.Parent}}' $(docker images -a -q) | grep "PAR ${parent_id}" | sed -E "s/ID ([^ ]*) PAR ([^ ]*)/\1/g" 
} 

print_kids() { 
    local parent_id=$1 
    local prefix=$2 
    local tags=`docker inspect --format='{{.RepoTags}}' ${parent_id}` 
    echo "${prefix}${parent_id} ${tags}" 

    local children=`get_kids "${parent_id}"` 

    for c in $children; 
    do 
     print_kids "$c" "$prefix " 
    done 
} 

print_kids "$parent_id" "" 
+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 18102379) –

+0

コードの書式設定に問題がありましたので、私はこの1月をやってくれてありがとう –

関連する問題