도커에서 종속된 하위 이미지 목록을 가져오는 방법은 무엇입니까?
이미지를 제거하려고 하면 다음과 같은 메시지가 표시됩니다.
# 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를 가진 실행 중이거나 중지된 컨테이너가 없습니다.
많은 수의 이미지가 없는 경우 항상 강력한 접근 방식이 있습니다.
for i in $(docker images -q)
do
docker history $i | grep -q f50f9524513f && echo $i
done | sort -u
단답:다음은 종속 도커 이미지를 나열하는 python3 스크립트입니다.
긴 답변:다음과 같은 경우 해당 이미지 이후에 생성된 모든 이미지에 대한 이미지 ID 및 상위 ID를 볼 수 있습니다.
docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --filter since=f50f9524513f --quiet)
f50f9524513f로 시작하는 부모 ID의 이미지를 검색한 다음 해당 이미지의 자식 이미지 등을 검색할 수 있어야 합니다. .Parent
당신이 생각하는 것이 아닙니다. 그래서 대부분의 경우 당신은 지정해야 할 것입니다.docker images --all
위에서 이 작업을 수행하면 모든 중간 계층에 대한 이미지 ID도 얻을 수 있습니다.
도커 출력을 구문 분석하고 이미지 목록을 생성하기 위해 검색을 수행하는 더 제한된 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 __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))))
이것을 다음과 같이 저장하면desc.py
다음과 같이 호출할 수 있습니다.
docker images \
| fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --all --quiet) \
| python3 desc.py f50f9524513f )
또는 위의 요지를 사용하면 됩니다. 그것은 같은 일을 합니다.
dockviz를 설치하고 트리 보기의 이미지 ID에서 분기를 따릅니다.
dockviz images --tree -l
셸 스크립트로 도커 이미지의 하위 트리를 출력하는 요지를 만들었습니다. 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" ""
슬러시와 마이클 호프만의 대답을 바탕으로 이미지가 많이 없으면 다음 셸 기능을 사용할 수 있습니다.
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]++'
APIPython 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 __name__ == "__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 에서 요지로 이용할 수 있도록 했습니다.
부모 이미지에 종속된 자식 이미지 목록을 가져오는 간단한 방법은 다음과 같습니다.
image_id=123456789012
docker images -a -q --filter since=$image_id |
xargs docker inspect --format='{{.Id}} {{.Parent}}' |
grep $image_id
그러면 하위/상위 이미지 ID 목록이 생성됩니다. 예를 들어, 다음과 같습니다(간단하게 설명하기 위해 잘림).
sha256:abcdefghijkl sha256:123456789012
왼쪽은 하위 이미지 ID이고 오른쪽은 삭제하려는 상위 이미지 ID이지만 "이미지에 종속된 하위 이미지가 있습니다"라는 메시지가 표시됩니다.이것은 우리가abcdefghijkl
는?123456789012
는 먼저 ▁to▁first가 필요합니다.docker rmi abcdefghijkl
그러면 할 수 있습니다.docker rmi 123456789012
.
종속된 하위 이미지의 체인이 있을 수 있으므로 마지막 하위 이미지를 찾기 위해 계속 반복해야 할 수 있습니다.
이것은 저의 마지막 "이미지"(레이어, 정말로 - 제가 막 도커 빌드에 들어가면서 저를 벗어 던졌던 것입니다.)를 보존하기 위해 제가 한 일입니다.
"... 강요할 수 없는..."메시지를 보냅니다.필요하지 않은 이미지는 '도커 커밋'에 의해 만들어진 독립적인 이미지가 아니기 때문에 삭제할 수 없다는 것을 깨달았습니다.문제는 기본 이미지와 최종 이미지 사이에 여러 개의 이미지(또는 레이어)가 있다는 것입니다. 그리고 정리를 시도하는 것은 아이와 부모에 대한 오류/경고를 충족하는 것입니다.
- 최종 이미지(또는 레이어)를 타르볼로 내보냈습니다.
- 그런 다음 기말고사를 포함하여 제가 원하는 모든 이미지를 삭제했습니다. 타르볼에 저장되어 있기 때문에 사용할 수 있을지 확신할 수 없는 동안, 저는 그저 실험을 하고 있었습니다.
- 나는 그 다음에 달렸습니다.
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:82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85e9edc47b41dacfd6382
이제 'docker imagels'로 목록을 작성하면 원본 기본 이미지와 이전에 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
도커의 아래 디렉터리를 통해 상위 및 하위 관계에 관계없이 도커 이미지를 삭제할 수 있습니다.
/var/lib/docker/image/devicemapper/imagedb/content/sha256
이 디렉터리에서 도커 이미지를 찾을 수 있으므로 원하는 항목을 삭제할 수 있습니다.
어때요?
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)
ID를 아이의 이미지 ID는 이이를 고 인 하 쇄 지 미 아 하 , 고 인 ▁it 쇄 ▁the▁id를▁print'll▁the's▁with▁image▁id▁child,,sha256:
prefix
또한 다음과 같은 이름이 추가되었습니다.
IMAGES=$(docker inspect --format="{{if eq \"$ID\" .Config.Image}}{{.Id}}{{.RepoTags}}{{end}}" $(docker images --filter since="$ID" -q))
ID=
.IMAGES=
된 모든 .Image
echo...
을 제거하고 .
저는 아이들과 그들의 레포태그를 재귀적으로 찾고 그들이 하는 일을 인쇄하기 위해 이것을 만들었습니다.
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-*를 삭제하는 것을 잊지 마십시오.
다음은 awk를 사용하여 종속 자식 이미지 ID를 직접 제공하는 스크립트입니다.
#!/bin/sh
set -e
parent=$1
echo "Dependent Child Images IDs of $parent "
docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --all --quiet --filter since=$parent) \
| awk -v parent=$parent '{ if($2 == parent) print $1 }'
상위 이미지 ID를 첫 번째 매개 변수로 전달하여 사용합니다.
$ ./get_children_of.sh sha256:15f16e6da280b21e8d3b17ac49022732a553550a15ad2d0d12d5cf22b36254cb
Dependent Child IDs of sha256:15f16e6da280b21e8d3b17ac49022732a553550a15ad2d0d12d5cf22b36254cb
sha256:c18db0311efb263c0f52e520d107b02a373aac7a4821164e7a1b46b14a3a1419
저 또한 같은 문제에 직면하고 있었습니다.문제를 해결하기 위해 아래의 단계를 따릅니다.
실행 중인 모든 컨테이너 중지
도커 스톱 $(도커 ps -aq) 모든 컨테이너 제거
docker rm $(docker ps -aq) 모든 이미지 제거
도커 rmi $(도커 이미지 -q)
언급URL : https://stackoverflow.com/questions/36584122/how-to-get-the-list-of-dependent-child-images-in-docker
'programing' 카테고리의 다른 글
도커 합성을 사용하여 mysql의 기본 문자 집합을 변경하는 방법은 무엇입니까? (0) | 2023.08.10 |
---|---|
assert(0)의 의미는 무엇입니까? (0) | 2023.08.10 |
Android Studio, 앱 종료 후 로그캣 청소 (0) | 2023.08.05 |
ODBC 드라이버의 차이점 (0) | 2023.08.05 |
Spring JPA(Hibernate) Entity Manager와의 연결 풀에 연결이 반환되는 시기는 언제입니까? (0) | 2023.08.05 |