私は画像を削除しようとしていますが、私は得る:
# 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バージョンです。
# 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を持つ実行中または停止中のコンテナはありません。
短い答え:これはpython3スクリプトです 依存するdockerイメージをリストします。
長答:次のようにして、問題の画像の後に作成されたすべての画像の画像IDと親IDを見ることができます:
docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --filter since=f50f9524513f --quiet)
F50f9524513fで始まる親IDの画像を探し、次にthoseなどの子画像を探します。But.Parent
あなたが思うことではありません。 、ほとんどの場合、上記のdocker images --all
を指定して動作させる必要があり、すべての中間層のイメージIDも取得します。
以下は、docker出力を解析し、検索を実行して画像のリストを生成するための、より制限されたpython3スクリプトです。
#!/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 __== '__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))))
これをdesc.py
として保存すると、次のように呼び出すことができます。
docker images \
| fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --all --quiet) \
| python3 desc.py f50f9524513f )
または、単に 上記の要点 を使用して、同じことを行います。
膨大な数の画像がない場合は、常に総当たり的なアプローチがあります。
for i in $(docker images -q)
do
docker history $i | grep -q f50f9524513f && echo $i
done | sort -u
dockviz をインストールし、ツリービューのイメージIDからのブランチに従います。
go get github.com/justone/dockviz
$(go env GOPATH)/bin/dockviz images --tree -l
Gist を作成しました。シェルスクリプトで、bashソリューションに興味がある人のために、Dockerイメージの子孫ツリーを出力します。
#!/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" ""
slushy および Michael Hoffman の回答に基づいて、大量の画像がない場合は、このシェル関数を使用できます。
docker_image_desc() {
for image in $(docker images --quiet --filter "since=${1}"); do
if [ $(docker history --quiet ${image} | grep ${1}) ]; then
docker_image_desc "${image}"
fi
done
echo "${1}"
}
を使用して呼び出します
docker_image_desc <image-id> | awk '!x[$0]++'
これは、最終的な「イメージ」を保持するために私がしたことです(レイヤー、本当に-これは、ドッカービルドを始めたばかりなので、私を落胆させたものです)。
「...強制することはできません...」というメッセージ全体を受け取りました。 「docker commit」によって作成された独立した画像ではないため、必要のない画像を削除できないことに気付きました。私の問題は、ベースイメージとファイナルの間にいくつかのイメージ(またはレイヤー)があり、ただクリーンアップしようとすると、子と親に関するエラー/警告が発生したことです。
docker image load -i FinalImage.tar.gz
を実行しました。出力は次のようなものでした:7d9b54235881: Loading layer [==================================================>] 167.1MB/167.1MB
c044b7095786: Loading layer [==================================================>] 20.89MB/20.89MB
fe94dbd0255e: Loading layer [==================================================>] 42.05MB/42.05MB
19abaa1dc0d4: Loading layer [==================================================>] 37.96MB/37.96MB
4865d7b6fdb2: Loading layer [==================================================>] 169.6MB/169.6MB
a0c115c7b87c: Loading layer [==================================================>] 132MB/132MB
読み込まれたイメージID:sha256:82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382
さて、「docker image ls」でリストすると、元のベースイメージと、以前tarballに保存した最終イメージしかありません。
[root@docker1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd import 82d4f8ef9ea1 3 days ago 747MB
centos httpd 36540f359ca3 5 weeks ago 193MB
私のシステムは今「きれい」です。欲しい画像しかありません。問題なくベース画像を削除しました。
[root@docker1 ~]# docker rmi 36540f359ca3
Untagged: centos:httpd
Untagged: centos@sha256:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131
Deleted: sha256:36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f
Dockerの以下のディレクトリを使用して、親子関係に関係なくDockerイメージを削除できます。
/var/lib/docker/image/devicemapper/imagedb/content/sha256
このディレクトリでDockerイメージを検索できるため、必要なものを削除できます。
Python API(pip install docker
)に基づくソリューションは、子孫とタグ(存在する場合)を再帰的にリストし、関係の深さ(子、孫など)に従ってインデントを増やします。
import argparse
import docker
def find_img(img_idx, id):
try:
return img_idx[id]
except KeyError:
for k, v in img_idx.items():
if k.rsplit(":", 1)[-1].startswith(id):
return v
raise RuntimeError("No image with ID: %s" % id)
def get_children(img_idx):
rval = {}
for img in img_idx.values():
p_id = img.attrs["Parent"]
rval.setdefault(p_id, set()).add(img.id)
return rval
def print_descendants(img_idx, children_map, img_id, indent=0):
children_ids = children_map.get(img_id, [])
for id in children_ids:
child = img_idx[id]
print(" " * indent, id, child.tags)
print_descendants(img_idx, children_map, id, indent=indent+2)
def main(args):
client = docker.from_env()
img_idx = {_.id: _ for _ in client.images.list(all=True)}
img = find_img(img_idx, args.id)
children_map = get_children(img_idx)
print_descendants(img_idx, children_map, img.id)
if __== "__main__":
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("id", metavar="IMAGE_ID")
main(parser.parse_args())
例:
$ python find_dep_img.py 549afbf12931
sha256:913d0981fdc7d2d673f2c8135b7afd32ba5037755e89b00432d3460422ba99b9 []
sha256:0748dbc043b96ef9f88265c422e0267807f542e364b7a7fadf371ba5ee082b5d []
sha256:6669414d2a0cc31b241a1fbb00c0ca00fa4dc4fa65dffb532bac90d3943d6a0a []
sha256:a6441e7d9e92511608aad631f9abe8627033de41305c2edf7e03ee36f94f0817 ['foo/bar:latest']
https://Gist.github.com/simleo/10ad923f9d8a2fa410f7ec2d7e96ad57 で要点として利用できるようにしました
私はこれを作成して、再帰的に子供とそのレポタグを見つけ、彼らがしていることを印刷します:
docker_img_tree() {
for i in $(docker image ls -qa) ; do
[ -f "/tmp/dii-$i" ] || ( docker image inspect $i > /tmp/dii-$i)
if grep -qiE 'Parent.*'$1 /tmp/dii-$i ; then
echo "$2============= $i (par=$1)"
awk '/(Cmd|Repo).*\[/,/\]/' /tmp/dii-$i | sed "s/^/$2/"
docker_img_tree $i $2===
fi
done
}
ホストが安全でない場合は、忘れずに/ tmp/dii- *を削除してください。
どうですか:
ID=$(docker inspect --format="{{.Id}}" "$1")
IMAGES=$(docker inspect --format="{{if eq \"$ID\" .Config.Image}}{{.Id}}{{end}}" $(docker images --filter since="$ID" -q))
echo $(printf "%s\n" "${IMAGES[@]}" | sort -u)
sha256:
プレフィックスを付けて、子イメージIDを出力します。
次のものもあり、名前を追加しています。
IMAGES=$(docker inspect --format="{{if eq \"$ID\" .Config.Image}}{{.Id}}{{.RepoTags}}{{end}}" $(docker images --filter since="$ID" -q))
ID=
画像の完全なIDを取得しますIMAGES=
は、この画像がImage
としてリストされているすべての子画像を取得しますecho...
重複を削除し、結果をエコーします