종속 자식 이미지가있는 도커 이미지를 삭제할 수 없습니다


164

노력하고 있습니다

docker rmi c565603bc87f

오류:

데몬의 오류 응답 : 충돌 : c565603bc87f를 삭제할 수 없습니다 (강제 할 수 없음)-이미지에 종속 자식 이미지가 있습니다

따라서 -f 플래그를 사용해도 이미지를 삭제할 수 없습니다. 이미지를 삭제하고 모든 하위 항목을 삭제하는 방법은 무엇입니까?

리눅스와 도커 버전 :

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP 6 월 8 일 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

docker version 클라이언트 : 버전 : 1.11.2 API 버전 : 1.23 Go 버전 : go1.5.4 Git commit : b9f10c9 Built : Wed Jun 1 22:00:43 2016 OS / Arch : linux / amd64

서버 : 버전 : 1.11.2 API 버전 : 1.23 Go 버전 : go1.5.4 Git 커밋 : b9f10c9 빌드 : Wed Jun 1 22:00:43 2016 OS / 아치 : linux / amd64



2
최신에서 가장 오래된 태그로 삭제하십시오. 그들이 repo에 살고 있다면, Dockerfile이 필요로 할 때 뽑힐 것입니다.
rafaelbattesti

Nguyen이 제공 한 (매우 좋은) 답변을 받아 들여야합니다
jpw

답변:


119

이미지를 제거하기 전에 불필요한 이미지를 제거해야합니다.

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

그 후 다음을 실행하십시오.

docker rmi c565603bc87f

13
매달려있는 이미지가 없습니다 ... docker images -f dangling = true-> 아무것도
로마

39
이 답변은 "매달린 이미지를 어떻게 제거합니까?"라는 다른 질문에 대한 답변입니다. OP의 질문은 "종속 이미지를 어떻게 제거합니까?"입니다.
tu-Reinstate Monica-dor du

6
매달려있는 이미지를 제거하려면prune
Deqing

17
그 명령은 더 이상 작동하지 않습니다 :> "docker rmi" requires at least 1 argument.
samayo

2
@samayo 오류가 발생하면 필터 부분을 다음과 같이 변경하십시오 --filter=dangling=true. 그래도 오류가 발생하면 매달려있는 이미지가 없으므로 설정 명령이 빈 문자열로 평가됩니다.
HammerN'Songs

100

어떤 경우에는 (내 경우와 같이) 존재하지 않는 여러 태그가있는 이미지 ID를 지정하여 이미지 를 삭제하려고 할 수 있습니다 . 일부는 다른 이미지에서 사용될 수 있습니다. 이 경우 이미지를 제거하지 않을 수 있습니다 .

여기에 설명 된대로 중복 태그가있는 경우 제거하려는 중복 태그 대신 docker rmi <image_id>사용 docker rmi <repo:tag>하십시오.


11
docker rmi <repo:tag>귀하의 솔루션은 그 답변 중 매우 간단합니다. 감사합니다.
Shihe Zhang

이것은 더 오래된 골랑 이미지를 원격으로 처리 할 수있는 코레 트 방식이어야합니다.
temple

이 티켓이 고마워요 Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

누구든지 Microsoft의 eShopOnContainers 샘플을 설치 한 repo:tag경우 두 개의 이미지 ID 만 공유하는 8 개의 태그가 지정된 이미지를 생성 하므로이 방법으로 각 방법을 제거해야합니다 . 심지어 비주얼 스튜디오는 ... 컨테이너 관리 창에서 삭제되지 않습니다
mdisibio

이 명령 docker rmi <repo:tag>태그 만 제거하며 반드시 이미지를 삭제하지는 않습니다. 이 이미지를 참조하는 태그가 둘 이상 있거나 OP에 의해 지정된 것과 같은 다른 문제가있는 경우 이미지는 여전히 존재합니다. 명령으로 이미지가 여전히 존재하는지 확인할 수 있습니다 docker images ls --all.
twan163

50

이전의 모든 대답은 정확하지만 여기에 모든 이미지를 강제로 삭제 하는 솔루션이 있습니다 (이 명령을 사용하면 모든 이미지가 삭제됩니다 )

docker rmi $(docker images -q) -f

여기에 이미지 설명을 입력하십시오


1
이것은 나를 위해 일했다. 방금 모든 로컬 이미지를 날려 버리고 싶었습니다. 도커 버전 (18.09.7)을 사용하려면 업데이트해야했습니다. docker image rm $(docker image ls -a -q) -f
akagixxer

40

해당 이미지 이후에 생성 된 모든 이미지의 이미지 ID 및 부모 ID를 다음과 같이 찾으십시오.

docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)

그런 다음 명령을 호출하십시오.

docker rmi {sub_image_id} 

"sub_image_id"는 종속 이미지의 ID입니다.


특정 이미지의 중간 이미지를 삭제하는 것이 좋습니다. 감사!!
A.Villegas

unknown flag --filter : /
사무라이 잭

이것은 질문에 대한 실제 해결책 인 것 같습니다!
Paolo

28

나에게 일한 것은 이미지 ID 대신 REPOSITORY : TAG 조합을 사용하는 것이 었습니다.

docker rmi <IMAGE ID>이 이미지와 관련된 컨테이너가없는 명령 으로 도커 이미지를 삭제하려고 할 때 메시지가 표시되었습니다.

$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images

명령을 사용하면 성공적으로 삭제할 수 있습니다 docker rmi RPOSITORY:TAG

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1

과연. 왜이 이상한 행동을 설명해 주시겠습니까?
RodrigoM

1
이것은 나를 위해 일했다. 필자의 경우 오래된 Ubuntu 이미지가 있었지만 다른 이미지에서 부모로 참조되지 않았지만 여전히 제거 할 수 없었습니다. docker rmi 93fd78260bd1실패했지만 docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:temp성공했습니다.
Thomas Lobker

나를 위해 일하고 오래된 이미지도 업데이트하고있었습니다. 누구나 왜 그것이 실패했는지 알고 있습니까?
strider

3
이것은 실제로 이미지를 삭제하지는 않습니다. 해당 이미지의 중복 태그를 제거하기 때문에 메시지가 표시 Untagged: ubuntu:18.04v1됩니다. 당신이하는 경우 docker images -a, 당신은 아마 3f66bec2c6bf여전히 나열되어 표시됩니다. 이미지가 실제로 삭제되면 다음 메시지가 표시됩니다Deleted: 3f66bec2c6bf
wisbucky

17

이 명령은 모든 이미지를 제거합니다 (주의와 함께 사용)

--force를 사용해 보셨습니까?

sudo docker rmi $(sudo docker images -aq) --force

이 위의 코드는 심지어 같은 문제가있는 매력처럼 실행됩니다.


1
나는 두 곳에서 sudo를 중단했고 그것은 나를 위해 훌륭했다
user2217751


6

다음은 이미지와 이미지에 의존하는 모든 이미지를 제거하는 스크립트입니다.

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo must supply image to remove;
    exit 1;
fi;

get_image_children ()
{
    ret=()
    for i in $(docker image ls -a --no-trunc -q); do
        #>&2 echo processing image "$i";
        #>&2 echo parent is $(docker image inspect --format '{{.Parent}}' "$i")
        if [[ "$(docker image inspect --format '{{.Parent}}' "$i")" == "$1" ]]; then
            ret+=("$i");
        fi;
    done;
    echo "${ret[@]}";
}

realid=$(docker image inspect --format '{{.Id}}' "$1")
if [[ -z "$realid" ]]; then
    echo "$1 is not a valid image.";
    exit 2;
fi;
images_to_remove=("$realid");
images_to_process=("$realid");
while [[ "${#images_to_process[@]}" -gt 0 ]]; do
    children_to_process=();
    for i in "${!images_to_process[@]}"; do
        children=$(get_image_children "${images_to_process[$i]}");
        if [[ ! -z "$children" ]]; then
            # allow word splitting on the children.
            children_to_process+=($children);
        fi;
    done;
    if [[ "${#children_to_process[@]}" -gt 0 ]]; then
        images_to_process=("${children_to_process[@]}");
        images_to_remove+=("${children_to_process[@]}");
    else
        #no images have any children. We're done creating the graph.
        break;
    fi;
done;
echo images_to_remove = "$(printf %s\n "${images_to_remove[@]}")";
indices=(${!images_to_remove[@]});
for ((i="${#indices[@]}" - 1; i >= 0; --i)) ; do
    image_to_remove="${images_to_remove[indices[i]]}"
    if [[ "${image_to_remove:0:7}" == "sha256:" ]]; then
        image_to_remove="${image_to_remove:7}";
    fi
    echo removing image "$image_to_remove";
    docker rmi "$image_to_remove";
done

6
# docker rm $(docker ps -aq)

그 후 Nguyen이 제안한 명령을 사용하십시오.


4

여기 에 Simon Brady의 무차별 대입법을 기반으로 , 많은 이미지가 없다면이 쉘 함수를 사용할 수 있습니다.

recursive_remove_image() {
  for image in $(docker images --quiet --filter "since=${1}")
  do
    if [ $(docker history --quiet ${image} | grep ${1}) ]
    then
      recursive_remove_image "${image}"
    fi
  done
  echo "Removing: ${1}"
  docker rmi -f ${1}
}

을 사용하여 호출하십시오 recursive_remove_image <image-id>.


4
docker rmi <rep:tag>

전의:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB

docker rmi python : 3.6


3

"<none>"docker에서 이름 으로 사용하지 않는 이미지를 제거하고 싶을 때 unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images문제가 발생합니다.이 문제를 해결하기 위해 :

sudo docker ps -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
01ee1276bbe0        lizard:1                    "/bin/sh -c 'java ..."   About an hour ago   Exited (1) About an hour ago                                                      objective_lewin
49d73d8fb023        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Up 19 hours                    0.0.0.0:8091->8091/tcp                             pedantic_bell
405fd452c788        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           infallible_varahamihira
532257a8b705        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           demo-default
9807158b3fd5        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           xenodochial_kilby
474930241afa        jenkins                     "/bin/tini -- /usr..."   13 days ago         Up 4 days                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
563d8c34682f        mysql/mysql-server:latest   "/entrypoint.sh my..."   3 weeks ago         Up 4 days (healthy)            0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
b4ca73d45d20        phpmyadmin/phpmyadmin       "/run.sh phpmyadmin"     4 weeks ago         Exited (0) 3 weeks ago                                                            phpmyadmin

javaapp : latest 이름과 다른 컨테이너 이름을 가진 여러 이미지가 있음을 알 수 있습니다. 그래서 나는 "javaapp : latest"컨테이너의 모든 컨테이너를 죽이고 제거했다.

sudo docker stop "containerName"

sudo docker rm "containrName"

그때

sudo docker rmi -f "imageId"

이름이있는 모든 이미지를 제거 할 수 있습니다 "<none>"

행운을 빕니다


1

또한이 문제가 발생하여 아래 명령으로 문제를 해결할 수 있습니다. 이미지 컨테이너가 실행 중이거나 종료되어 이미지를 제거하기 전에 컨테이너를 제거해야 할 수 있습니다.

docker ps -a -f status = exited :이 명령은 종료 된 모든 컨테이너를 표시하므로 컨테이너 ID를 복사 한 다음 아래 명령을 실행하여 컨테이너를 제거하십시오

docker rm #containerId :이 명령은 컨테이너를 제거합니다. "이미지에 종속 자식 이미지가 있습니다"라는 문제가 발생할 수 있습니다.

그런 다음 아래 명령으로 이미지를 제거하십시오.

도커 rmi #ImageId


1

나는이 문제가 있었고 위의 @tudor가 언급 한 페이지에서도 짧은 답변 중 아무것도 작동하지 않았습니다. 이미지를 어떻게 제거했는지 여기에서 공유하겠다고 생각했습니다. 의존적 이미지는 부모 이미지의 크기보다 크거나 같아야한다는 것을 생각했습니다.이를 통해 이미지를 식별 할 수 있습니다.

상관 관계를 찾을 수 있는지 확인하기 위해 이미지를 크기 순으로 나열했습니다.

docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t

이것이하는 일은 docker의 특수 형식을 사용하여 이미지 크기 열을 먼저 배치 한 다음 사람이 읽을 수있는 정렬을 역순으로 실행하는 것입니다. 그런 다음 읽기 쉬운 열을 복원합니다.

그런 다음 <none>컨테이너를 살펴보고 목록의 첫 번째 컨테이너를 비슷한 크기로 일치 시켰습니다. 나는 docker rmi <image:tag>그 이미지를 단순하게 수행 했으며 모든 <none>자식 이미지는 그와 함께 갔다.

모든 자식 이미지가있는 문제 이미지는 실제로 도커로 처음 게임을 시작했을 때 myrepo/getstarted-lab 사용한 지독한 이미지였습니다 . 체인을 만든 첫 번째 테스트 이미지에서 새 이미지를 만들었 기 때문입니다.

바라건대 그것은 어느 시점에서 다른 누군가를 돕습니다.


1

Dockerfile이 있다고 가정하십시오.

FROM ubuntu:trusty
CMD ping localhost

우리는 TAG 또는 이름을 지정하지 않고 이미지를 만듭니다.

docker build .

이제 도커 이미지를 보면 성공 보고서 "성공적으로 57ca5ce94d04를 구축했습니다"가 표시됩니다.

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              57ca5ce94d04        18 seconds ago      188MB
ubuntu              trusty              8789038981bc        11 days ago         188MB

먼저 제거해야합니다 docker rmi 57ca5ce94d04

뒤에

docker rmi 8789038981bc

그 이미지에 의해 제거됩니다!

누군가가 제안한 모든 것을 강제로 제거

docker rmi $(docker images -q) -f

1

@Nguyen이 제공 한 답변을 확장하면이 기능을 .bashrc기타에 추가 한 다음 명령 줄에서 호출하여 image has dependent child images오류를 정리할 수 있습니다 ...

함수를 직접 실행할 수 있으며, docker ps실패하면 docker명령을 실행하고 sudo비밀번호를 묻는 프롬프트를 표시합니다.

않습니다 NOT 실행중인 컨테이너에 대한 이미지를 삭제!

docker_rmi_dependants ()                                                                                                                                                         
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  for n in $(${DOCKER} images | awk '$2 == "<none>" {print $3}');
  do  
    echo "ImageID: $n";
    ${DOCKER} inspect --format='{{.Id}} {{.Parent}}' $(${DOCKER} images --filter since=$n -q);
  done;

  ${DOCKER} rmi $(${DOCKER} images | awk '$2 == "<none>" {print $3}')
}

나는 또한 내 .bashrc파일에 이것을 가지고있다 ...

docker_rm_dangling ()  
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  ${DOCKER} images -f dangling=true 2>&1 > /dev/null && YES=$?;                                                                                                                  
  if [ $YES -eq 1 ]; then
    read -t 30 -p "Press ENTER to remove, or CTRL-C to quit.";
    ${DOCKER} rmi $(${DOCKER} images -f dangling=true -q);
  else
    echo "Nothing to do... all groovy!";
  fi  
}

와 일하다:

$ docker --version 
Docker version 17.05.0-ce, build 89658be

0

이미지 목록을 강제로 삭제 (예 : 버전 10 제외)

도커 이미지 | grep 버전 | grep -v version10> images.txt && in img in $ (awk -F "" '{print $ 3}'/root/images.txt); docker rmi -f $ img; 끝난


-1

당신은 이것을 할 수 있습니다 :

➜ ~ sudo는 고정 표시기 RMI 4ed13257bb55 -f 삭제 : SHA256 : 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 삭제 : SHA256 : 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 삭제 : SHA256 : 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 삭제 : SHA256 : d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

이미지 레이어 : 리포지토리는 종종 이미지 또는 컨테이너 이미지라고하지만 실제로는 하나 이상의 레이어로 구성됩니다. 리포지토리의 이미지 레이어는 부모-자식 관계로 함께 연결됩니다. 각 이미지 레이어는 자신과 부모 레이어 사이의 변화를 나타냅니다.

docker building 패턴은 상속을 사용합니다 . 버전이 버전에 i따라 달라짐을 의미합니다 i-1. 따라서 버전 i+1을 삭제하려면 버전 을 삭제해야합니다 i. 이것은 간단한 의존성입니다.

마지막 이미지 (가장 최근 업데이트 된 이미지)와 첫 번째 (기본) 이미지를 제외한 모든 이미지를 삭제하려면 docker save아래와 같이 명령을 사용하여 마지막 이미지 (가장 업데이트 된 이미지)를 내보낼 수 있습니다.

docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz

그런 다음 image-id 를 사용하여 아래와 같이 모든 이미지를 삭제하십시오 .

docker rm -f <image-id i> | docker rm -f <image i-1> | docker rm -f <image-id i-2> ... <docker rm -f <image-id i-k> # where i-k = 1

이제 저장된 tgz 이미지를 아래와 같이로드하십시오.

gzip -c <output_file.tgz> | docker load

docker ps -q를 사용하여로드 된 이미지의 이미지 ID를 참조하십시오. 태그와 이름이 없습니다. 아래처럼 태그와 이름을 간단히 업데이트 할 수 있습니다.

docker tag <image_id> group_name/name:tag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.