Nie można usunąć obrazu Dockera z zależnymi obrazami podrzędnymi


164

próbuję

docker rmi c565603bc87f

Błąd:

Odpowiedź na błąd od demona: konflikt: nie można usunąć c565603bc87f (nie można wymusić) - obraz ma zależne obrazy podrzędne

Więc nie mogę usunąć obrazu nawet z flagą -f. Jak wtedy usunąć obraz i wszystkie jego dzieci?

Wersja Linux i Docker:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP środa 8 czerwca 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

wersja docker Klient: Wersja: 1.11.2 Wersja API: 1.23 Go Wersja: go1.5.4 Git zatwierdzenie: b9f10c9 Utworzono: środa 1 czerwca 22:00:43 2016 System operacyjny / Arch: linux / amd64

Serwer: Wersja: 1.11.2 Wersja API: 1.23 Go Wersja: go1.5.4 Git Commit: b9f10c9 Rok budowy: środa 1 czerwca 22:00:43 2016 System operacyjny / Arch: linux / amd64



2
Usuń według tagu od najnowszego do najstarszego. Jeśli żyją w repozytorium, zostaną ściągnięci, jeśli będzie ich wymagać jakikolwiek plik Dockerfile.
rafaelbattesti

powinieneś zaakceptować (bardzo dobrą) odpowiedź udzieloną przez Nguyena
jpw

Odpowiedzi:


119

Przed usunięciem obrazu należy spróbować usunąć niepotrzebne obrazy:

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

Następnie uruchom:

docker rmi c565603bc87f

13
Nie ma żadnych wiszących obrazów ... docker images -f dangling = true -> Nothing
Roman

39
Ta odpowiedź jest odpowiedzią na inne pytanie „Jak usunąć wiszące obrazy?” Pytanie OP brzmi „Jak usunąć obrazy zależne?”
tu-Przywróć Monica-dor duh

6
Aby usunąć wiszące obrazy, po prostu użyjprune
Deqing

17
to polecenie już nie działa:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo jeśli się tego błędu, spróbuj zmienić część filtra do: --filter=dangling=true. Jeśli nadal otrzymujesz ten błąd, oznacza to po prostu, że nie masz żadnych wiszących obrazów, a więc polecenie w zestawie oblicza jako pusty ciąg.
HammerN'Songs

100

W niektórych przypadkach (jak w moim przypadku) możesz próbować usunąć obraz , określając identyfikator obrazu, który ma wiele tagów , o których istnieniu nie zdajesz sobie sprawy, a niektóre z nich mogą być używane przez inne obrazy. W takim przypadku możesz nie chcieć usuwać obrazu .

Jeśli masz przypadek nadmiarowych tagów, jak opisano tutaj, zamiast docker rmi <image_id>używać docker rmi <repo:tag>na zbędnym tagu, który chcesz usunąć.


11
docker rmi <repo:tag>zadziałało dla mnie Twoje rozwiązanie jest dość proste wśród tych odpowiedzi, dziękuję.
Shihe Zhang

to powinien być właściwy sposób na zrobienie tego w moim przypadku w przypadku odległych starszych obrazów golang
świątynia

To był bilet dla mnie, dzięki. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

Jeśli ktoś zainstalował próbki Microsoft eShopOnContainers , absolutnie musisz usunąć każdy z nich w ten sposób, repo:tagponieważ tworzy osiem oznaczonych obrazów, które mają tylko dwa identyfikatory obrazów. Nawet Visual Studio nie usunie ich w swoim oknie zarządzania kontenerami ...
mdisibio

Polecenie docker rmi <repo:tag>tylko odznacza , niekoniecznie usuwa obraz. Jeśli istnieje więcej niż jeden znacznik odwołujący się do tego obrazu lub jeśli występuje inny problem, taki jak np. Ten podany przez OP, obraz nadal tam będzie. Możesz sprawdzić, czy obraz nadal istnieje za pomocą polecenia docker images ls --all.
twan163

50

wszystkie poprzednie odpowiedzi są poprawne, ale oto jedno rozwiązanie, które po prostu wymusza usunięcie wszystkich twoich obrazów ( użyj tego polecenia na własne ryzyko, spowoduje to usunięcie wszystkich twoich obrazów )

docker rmi $(docker images -q) -f

wprowadź opis obrazu tutaj


1
To zadziałało dla mnie; Chciałem tylko zdmuchnąć wszystkie lokalne obrazy. Uwaga, musiałem zaktualizować do pracy z moją wersją dockera (18.09.7): docker image rm $(docker image ls -a -q) -f
akagixxer

40

znajdź identyfikator obrazu i identyfikator nadrzędny dla wszystkich obrazów utworzonych po obrazie, o którym mowa, za pomocą następujących elementów:

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

Następnie wywołujesz polecenie:

docker rmi {sub_image_id} 

„sub_image_id” to identyfikator zależnego obrazu


Tak dobrze jest usuwać obrazy pośrednie określonego obrazu. Dzięki!!
A. Villegas,

nieznana flaga --filter: /
SamuraiJack

To wydaje się być właściwym rozwiązaniem tego pytania!
Paolo

28

Pomogło mi użycie kombinacji REPOSITORY: TAG zamiast IMAGE ID.

Kiedy próbowałem usunąć obraz dockera za pomocą polecenia docker rmi <IMAGE ID>bez kontenerów skojarzonych z tym obrazem, otrzymałem komunikat:

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

Mogłem usunąć z powodzeniem, gdy użyłem polecenia docker rmi RPOSITORY:TAG

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

W rzeczy samej. Jakieś wyjaśnienie, dlaczego to dziwne zachowanie?
RodrigoM,

1
U mnie to też zadziałało. W moim przypadku miałem nieaktualny obraz Ubuntu, nie odwoływał się do niego w żadnym innym obrazie jako rodzic, ale nadal nie można go było usunąć. docker rmi 93fd78260bd1nie powiodło się, ale potem się docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempudało.
Thomas Lobker

praca dla mnie, była również aktualizacja nieaktualnego obrazu. ktoś wie, dlaczego zawodzi?
Strider

3
To tak naprawdę nie usuwa obrazu. Po prostu usuwa zduplikowany tag dla tego obrazu (stąd wiadomość Untagged: ubuntu:18.04v1). Jeśli to zrobisz docker images -a, prawdopodobnie 3f66bec2c6bfnadal zobaczysz listę. Gdyby obraz został naprawdę usunięty, Deleted: 3f66bec2c6bf
dostałbyś

17

TO POLECENIE USUWA WSZYSTKIE OBRAZY (UŻYWAJ OSTRZEŻENIE)

Czy próbowałeś użyć --force

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

Powyższy kod działa jak urok, nawet ja miałem ten sam problem


1
Opuściłem sudo w obu miejscach i działało świetnie dla mnie
user2217751


6

Oto skrypt służący do usuwania obrazu i wszystkich obrazów, które od niego zależą.

#!/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)

Następnie użyj polecenia zgodnie z sugestią Nguyena.


4

Opierając się na metodzie brute force Simon Brady tutaj , jeśli nie mają mnóstwo zdjęć, które można używać tej funkcji powłoki:

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}
}

a następnie nazwij to używając recursive_remove_image <image-id>.


4
docker rmi <rep:tag>

Dawny:

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

docker rmi python: 3.6.0


3

Kiedy chcę usunąć nieużywany obraz z nazwą "<none>"w dockerze, napotykam problem unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images. Aby rozwiązać ten problem:

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

widać, że mam kilka obrazów o nazwie javaapp: najnowsza i inna nazwa kontenera. Dlatego zabiłem i usunąłem cały kontener „javaapp: latest” z:

sudo docker stop „containerName”

sudo docker rm "ContainrName"

Następnie

sudo docker rmi -f "imageId"

Więc mogę usunąć wszystkie obrazy z nazwą "<none>"

powodzenia


1

Mam również ten problem, mogłem rozwiązać problem za pomocą poniższych poleceń. może to być przyczyną, że kontener obrazu działa lub kończy pracę, więc przed usunięciem obrazu należy usunąć kontener

docker ps -a -f status = exited: to polecenie pokazuje wszystkie opuszczone kontenery, więc skopiuj identyfikator kontenera, a następnie uruchom poniższe polecenia, aby usunąć kontener

docker rm #containerId: to polecenie usuwa kontener, może to być problem ze wzmianką o „obrazie ma zależne obrazy podrzędne”

Następnie spróbuj usunąć obraz za pomocą poniższego polecenia

docker rmi #ImageId


1

Miałem ten problem i żadna z krótkich odpowiedzi nie zadziałała, nawet na stronie wspomnianej powyżej przez @tudor. Pomyślałem, że podzielę się tutaj, jak pozbyłem się obrazów. Wpadłem na pomysł, że obrazy zależne muszą mieć> = rozmiar obrazu nadrzędnego, co pomaga go zidentyfikować, abyśmy mogli go usunąć.

Podałem obrazy według rozmiaru, aby zobaczyć, czy mogę dostrzec jakieś korelacje:

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

Oznacza to użycie specjalnego formatowania z okna dokowanego, aby najpierw ustawić kolumnę rozmiaru obrazu, a następnie przeprowadzić sortowanie czytelne dla człowieka w odwrotnej kolejności. Następnie przywracam łatwe do odczytania kolumny.

Następnie spojrzałem na <none>pojemniki i dopasowałem pierwszy na liście o podobnym rozmiarze. Wykonałem prostą operację docker rmi <image:tag>na tym obrazie i wszystkich<none> obrazy dzieci poszły z nim.

Problem ze wszystkimi obrazami podrzędnymi był w rzeczywistości tym cholernym myrepo/getstarted-lab obrazem, którego użyłem gdy po raz pierwszy zacząłem bawić się dockerem. To dlatego, że stworzyłem nowy obraz z pierwszego obrazu testowego, który utworzył łańcuch.

Mam nadzieję, że w pewnym momencie pomoże to komuś innemu.


1

Załóżmy, że mamy plik Dockerfile

FROM ubuntu:trusty
CMD ping localhost

Z tego budujemy obraz bez TAG-a czy nazewnictwa

docker build .

Teraz mamy raport o sukcesie „Zbudowano pomyślnie 57ca5ce94d04” Jeśli widzimy obrazy dockera

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

Musimy najpierw usunąć docker rmi 57ca5ce94d04

Śledzony przez

docker rmi 8789038981bc

Ten obraz zostanie usunięty!

Wymuszone usunięcie wszystkiego, zgodnie z sugestią kogoś

docker rmi $(docker images -q) -f

1

Rozszerzanie odpowiedzi udzielonej przez @Nguyen - tę funkcję można dodać do swojego .bashrcitp., A następnie wywołać z wiersza poleceń, aby pomóc wyczyścićimage has dependent child images błędy ...

Możesz uruchomić tę funkcję samodzielnie, a jeśli się docker psnie powiedzie, uruchomi dockerpolecenie sudoi poprosi o podanie hasła.

Czy nie kasować obrazy za systemem pojemników!

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}')
}

Mam to też w swoich .bashrcaktach ...

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  
}

Pracuje z:

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

0

Wymuś usunięcie listy obrazów (na przykład wyklucz wersję 10)

obrazy docker | wersja grep | grep -v wersja10> images.txt && dla img w $ (awk -F "" '{print $ 3}' /root/images.txt); zrobić docker rmi -f $ img; Gotowe


-1

możesz po prostu to zrobić:

➜ ~ sudo doker RMI 4ed13257bb55 -f Deleted: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Deleted: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Deleted: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Deleted: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

Warstwa obrazu: repozytoria są często nazywane obrazami lub obrazami kontenerów, ale w rzeczywistości składają się z jednej lub więcej warstw. Warstwy obrazów w repozytorium są połączone ze sobą w relacji rodzic-dziecko. Każda warstwa obrazu reprezentuje zmiany między nią a warstwą macierzystą.

Wzorzec budowania Dockera korzysta z dziedziczenia . Oznacza to, że wersja izależy od wersji i-1. Musimy więc usunąć wersję, i+1aby móc usunąć wersję i. To jest prosta zależność.

Jeśli chcesz usunąć wszystkie obrazy z wyjątkiem ostatniego (najbardziej zaktualizowanego) i pierwszego (podstawowego), możemy wyeksportować ostatni (najbardziej zaktualizowany) za pomocą docker savepolecenia jak poniżej.

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

Następnie usuń wszystkie obrazy, używając identyfikatora obrazu, jak poniżej.

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

Teraz załaduj zapisany obraz tgz, jak poniżej.

gzip -c <output_file.tgz> | docker load

zobacz identyfikator obrazu załadowanego obrazu za pomocą docker ps -q. Nie ma tagu ani nazwy. Możesz po prostu zaktualizować tag i nazwę, jak pokazano poniżej.

docker tag <image_id> group_name/name:tag
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.