Bağımlı alt resimlerle liman işçisi resmi silinemiyor


164

deniyorum

docker rmi c565603bc87f

Hata:

Arka plan programından hata yanıtı: çakışma: c565603bc87f silinemiyor (zorlanamıyor) - resim bağımlı alt resimlere sahip

Bu yüzden -f bayrağıyla bile görüntü silemiyorum. O zaman ve tüm çocukları nasıl silinir?

Linux ve docker sürümü:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP Çar 8 Haz 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

docker sürümü İstemci: Sürüm: 1.11.2 API sürümü: 1.23 Git sürüm: go1.5.4 Git taahhüt: b9f10c9 Yapım: Çar Haziran 1 22:00:43 2016 İşletim Sistemi / Arch: linux / amd64

Sunucu: Sürüm: 1.11.2 API sürümü: 1.23 Git sürüm: go1.5.4 Git kesin: b9f10c9 Yapım: Çar Haziran 1 22:00:43 2016 İşletim Sistemi / Arch: linux / amd64



2
En yeniden en eskiye doğru etikete göre silin. Bir repoda yaşıyorlarsa, herhangi bir Dockerfile isterse çekilirler.
rafaelbattesti

Nguyen'in verdiği (çok iyi) cevabı kabul
etmelisin

Yanıtlar:


119

Görüntüyü kaldırmadan önce gereksiz görüntüleri kaldırmayı denemelisiniz:

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

Bundan sonra çalıştırın:

docker rmi c565603bc87f

13
Hiç sarkan görüntü yok ... docker görüntüleri -f dangling = true -> Hiçbir şey
Roman

39
Bu yanıt farklı bir soruyu "Sarkan görüntüleri nasıl silebilirim?" OP'nin sorusu "Bağımlı görüntüleri nasıl silebilirim?"
tu-Reinstate Monica-dor duh

6
Sarkan görüntüleri, sadece kullanımını kaldırmak içinprune
Deqing

17
bu komut artık çalışmıyor:> "docker rmi" requires at least 1 argument.
samayo

2
O hatayı alırsanız @samayo, filtre parçasını değiştirmeyi deneyin: --filter=dangling=true. Hala bu hatayı alıyorsanız, bu sadece sarkan resimleriniz olmadığı anlamına gelir ve böylece in-set komutu boş bir dize olarak değerlendirilir.
HammerN'Songs

100

Bazı durumlarda (benim durumumda olduğu gibi) , farkında olmadığınız birden fazla etiketi olan, bazıları diğer resimler tarafından kullanılabilecek resim kimliğini belirterek bir resmi silmeye çalışıyor olabilirsiniz. Bu durumda, görüntüyü kaldırmak istemeyebilirsiniz .

Kaldırmak istediğiniz yedek etikette docker rmi <image_id>kullanmak yerine, burada açıklandığı gibi bir yedek etiket durumunuz varsa docker rmi <repo:tag>.


11
docker rmi <repo:tag>Bu cevaplar arasında çözümünüz oldukça basit, teşekkürler.
Shihe Zhang

Bu benim durumum için eski golang görüntüleri uzaktan
tapınak

Bu benim için biletti, teşekkürler. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

Herhangi biri Microsoft'un eShopOnContainers örneklerini yüklediyse, repo:tagyalnızca iki resim kimliğini paylaşan sekiz etiketli görüntü oluşturduğu için her birini kesinlikle bu şekilde kaldırmanız gerekir . Visual Studio bile kapsayıcı yönetimi penceresinde onları silmez ...
mdisibio

Komut docker rmi <repo:tag>sadece etiketini kaldırır , bir resmi silmeyebilir . Bu görüntüye referans veren birden fazla etiket varsa veya OP tarafından belirtilen gibi başka bir sorun varsa, görüntü yine de orada olacaktır. Görüntünün hala var olup olmadığını komutla kontrol edebilirsiniz docker images ls --all.
twan163

50

önceki tüm yanıtlar doğrudur, ancak işte tüm resimlerinizi zorla silen tek bir çözüm ( bu komutu kendi sorumluluğunuzda kullanın, tüm resimlerinizi siler )

docker rmi $(docker images -q) -f

resim açıklamasını buraya girin


1
Bu benim için çalıştı; Sadece tüm yerel görüntülerimi havaya uçurmak istedim. Not, docker sürümüm (18.09.7) ile çalışmak için güncelleme yapmak zorunda kaldım: docker image rm $(docker image ls -a -q) -f
akagixxer

40

söz konusu görüntüden sonra oluşturulan tüm görseller için aşağıdakileri içeren görüntü kimliğini ve üst kimliği bulun:

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

Sonra komutu çağırırsınız:

docker rmi {sub_image_id} 

"sub_image_id" bağımlı resmin kimliğidir


Belirli bir görüntünün ara görüntülerini silmek çok güzel. Teşekkürler!!
A.Villegas

bilinmeyen bayrağı --filter: /
SamuraiJack

Bu sorunun asıl çözümü gibi görünüyor!
Paolo

28

Bana işe yarayan, IMAGE ID yerine REPOSITORY: TAG kombinasyonunu kullanmaktı.

Bu görüntü ile docker rmi <IMAGE ID>ilişkili kapsayıcıları olmayan bir komut ile docker görüntüsünü silmeye çalıştığımda mesajım vardı:

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

Komutu kullandığımda başarılı bir şekilde silebilirim docker rmi RPOSITORY:TAG

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

Aslında. Neden bu garip davranışın bir açıklaması var?
RodrigoM

1
Bu benim için de işe yaradı. Benim durumumda eski bir Ubuntu görüntüsü vardı, başka bir görüntüde üst öğe olarak referans gösterilmedi, ancak yine de kaldırılamadı. docker rmi 93fd78260bd1başarısız oldu, ancak docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempbaşarılı oldu.
Thomas Lobker

benim için çalışma, ayrıca güncel olmayan bir görüntü güncelleniyordu. kimse neden w kimliği başarısız biliyor?
strider

3
Bu görüntüyü gerçekten silmez. Yalnızca bu resim için yinelenen bir etiketi kaldırır (dolayısıyla mesaj Untagged: ubuntu:18.04v1). Bunu yaparsanız docker images -a, 3f66bec2c6bfhala listelenmiş olduğunu göreceksiniz . Görüntü gerçekten silinmiş olsaydı, mesajı alırsınızDeleted: 3f66bec2c6bf
wisbucky

17

BU KOMUT TÜM GÖRÜNTÜLERİ ÇIKARIR (DİKKATLİ KULLANIN)

--Force'u kullanmaya çalıştınız mı

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

Bu yukarıdaki kod bir çekicilik gibi çalıştırmak bile doe ben aynı sorunu vardı


1
Her iki yerde sudo bıraktım ve benim için harika çalıştı
user2217751


6

İşte bir resmi ve ona bağlı tüm resimleri kaldırmak için bir komut dosyası.

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

Bundan sonra Nguyen'ın önerdiği gibi komutu kullanın.


4

Simon Brady'nin kaba kuvvet yöntemini burada temel alan bir ton resminiz yoksa bu kabuk işlevini kullanabilirsiniz:

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

ve sonra kullanarak arayın recursive_remove_image <image-id>.


4
docker rmi <rep:tag>

Ör:

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

liman işçisi rmi python: 3.6


3

Ben "<none>"docker adı ile bazı kullanılmayan görüntü kaldırmak istediğinizde ben sorun ile karşı karşıya. Bu yüzden unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child imagesbu sorunu çözmek için:

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

En son ve farklı kapsayıcı adı: javaapp adında birkaç Görüntü olduğunu görebilirsiniz. Böylece, "javaapp: latest" konteynerinin tüm konteynerlerini öldürdüm ve kaldırdım:

sudo docker durağı "containerName"

sudo docker rm "içermeAdı"

Sonra

sudo docker rmi -f "imageId"

Böylece tüm resimleri isimle kaldırabilirim "<none>"

iyi şanslar


1

Bu sorunu da aldım, aşağıdaki komutlarla sorunu çözebilirim. bu neden olabilir, görüntünün kabı çalışıyor veya çıkıyor, bu yüzden görüntüyü kaldırmadan önce kabı çıkarmanız gerekiyor

docker ps -a -f status = exited: bu komut tüm çıkan kapsayıcıları gösterir, böylece kapsayıcı kimliğini kopyalayın ve kapsayıcıyı kaldırmak için aşağıdaki komutları çalıştırın

docker rm #containerId: Bu komut kaldırma kapsayıcısı, "görüntü bağımlı alt resimlere sahip" ifadesinden söz edilebilir.

Ardından aşağıdaki komutla resmi kaldırmayı deneyin

docker rmi #ImageId


1

Bu sorunu yaşadım ve buradaki kısa cevapların hiçbiri, yukarıdaki @tudor tarafından belirtilen sayfada bile işe yaramadı. Burada görüntülerden nasıl kurtulduğumu paylaşacağımı düşündüm. Bağımlı görüntülerin> = ana görüntünün boyutu olması gerektiği fikrini ortaya çıkardım, bu da onu kaldırabilmemiz için tanımlanmasına yardımcı olur.

Herhangi bir korelasyon tespit edip edemeyeceğinizi görmek için görüntüleri boyut sırasına göre listeledim:

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

Bunun yaptığı şey, önce görüntü boyutu sütununu konumlandırmak için docker'dan bazı özel biçimlendirmeler kullanmaktır, ardından insan tarafından okunabilir bir sıralamayı ters sırada çalıştırmaktır. Sonra okunması kolay sütunları geri yüklerim.

Sonra <none>kaplara baktım ve listedeki ilkini benzer bir boyutla eşleştirdim. docker rmi <image:tag>Bu görüntü üzerinde basit bir performans sergiledim ve tüm <none>çocuk görüntüleri onunla birlikte gitti.

Tüm alt görüntülerle sorun görüntü aslında lanet oldu myrepo/getstarted-lab ben kullanılan resim liman işçisiyle oynamaya başladığımda resimdi. Zira zinciri oluşturan ilk test görüntüsünden yeni bir görüntü yaratmıştım.

Umarım bu bir noktada başka birine yardımcı olur.


1

Bir Dockerfile'ımız olduğunu varsayalım

FROM ubuntu:trusty
CMD ping localhost

TAG veya adlandırma olmadan bundan görüntü oluşturuyoruz

docker build .

Şimdi bir başarı raporumuz var "Başarıyla inşa edilmiş 57ca5ce94d04" liman işçisinin resimlerini görürsek

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

Önce docker rmi 57ca5ce94d04

Bunu takiben

docker rmi 8789038981bc

Bu görüntü ile kaldırılacak!

Birinin önerdiği gibi hepsinin zorla kaldırılması

docker rmi $(docker images -q) -f

1

@Nguyen tarafından verilen yanıtı genişleterek - bu işlev .bashrcvb . Öğelerinize eklenebilir ve daha sonra herhangi bir şeyin temizlenmesine yardımcı olmak için komut satırından çağrılabilir.image has dependent child images hataları ...

İşlevi kendiniz gibi çalıştırabilirsiniz ve docker psbaşarısız olursa, dockerkomutu çalıştırır sudove parolanızı girmenizi ister.

Does DEĞİL herhangi çalıştıran konteynerler için görüntüleri silmek!

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

Benim dosyamda da bu var .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  
}

İle çalışır:

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

0

Bir resim listesini silmeye zorlayın (örneğin, sürüm 10'u hariç tutun)

liman işçisi resimleri | grep versiyonu | grep -v sürüm10> images.txt &&, img için $ (awk -F "" '{print $ 3}' /root/images.txt); docker rmi yapmak -f $ img; tamam


-1

sadece bunu yapabilirsiniz:

➜ ~ Sudo docker rmi 4ed13257bb55 -f silinmiş: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 silinmiş: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 silinmiş: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 silinmiş: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

Görüntü Katmanı: Depolara genellikle görüntüler veya kapsayıcı görüntüleri denir, ancak aslında bir veya daha fazla katmandan oluşurlar. Bir havuzdaki görüntü katmanları, bir üst-alt ilişkisinde birbirine bağlanır. Her görüntü katmanı, kendisi ve üst katman arasındaki değişiklikleri temsil eder.

Liman işçiliği bina kalıbı miras kullanır . Bu, sürümün sürüme ibağlı olduğu anlamına gelir i-1. Bu nedenle, sürümü silebilmek için sürümü i+1silmeliyiz i. Bu basit bir bağımlılık.

Sonuncusu (en güncel) ve ilk (temel) dışındaki tüm resimleri silmek istiyorsanız docker save, aşağıdaki komutu kullanarak sonuncuyu (en güncel olanı) dışa aktarabiliriz .

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

Ardından, aşağıdaki gibi image-id'yi kullanarak tüm resimleri silin .

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

Şimdi, kaydedilmiş tgz resminizi aşağıdaki gibi yükleyin.

gzip -c <output_file.tgz> | docker load

docker ps -q kullanarak yüklediğiniz görüntünün görüntü kimliğine bakın. Etiketi ve adı yok. Etiketi ve adı aşağıdaki gibi güncelleyebilirsiniz.

docker tag <image_id> group_name/name:tag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.