Tidak dapat menghapus gambar buruh pelabuhan dengan gambar anak yang tergantung


164

aku sedang mencoba

docker rmi c565603bc87f

Kesalahan:

Respons kesalahan dari daemon: konflik: tidak dapat menghapus c565603bc87f (tidak dapat dipaksa) - gambar bergantung pada gambar anak

Jadi saya tidak bisa menghapus gambar bahkan dengan flag -f. Bagaimana cara menghapus gambar itu dan semua anaknya?

Versi Linux dan buruh pelabuhan:

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

versi docker Klien: Versi: 1.11.2 Versi API: 1.23 Versi go: go1.5.4 Git commit: b9f10c9 Dibangun: Rabu, 1 Juni 22:00:43 2016 OS / Arch: linux / amd64

Server: Versi: 1.11.2 Versi API: 1.23 Go versi: go1.5.4 Git commit: b9f10c9 Dibangun: Rabu 1 Juni 22:00:43 2016 OS / Arch: linux / amd64



2
Hapus dengan tag dari yang terbaru ke terlama. Jika mereka hidup dalam repo, mereka akan ditarik jika Dockerfile membutuhkannya.
rafaelbattesti

Anda harus menerima jawaban (sangat bagus) yang diberikan Nguyen
jpw

Jawaban:


119

Anda harus mencoba untuk menghapus gambar yang tidak perlu sebelum menghapus gambar:

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

Setelah itu, jalankan:

docker rmi c565603bc87f

13
Tidak ada gambar yang menggantung ... gambar buruh pelabuhan -j menggantung = benar -> Tidak ada
Roman

39
Jawaban ini menjawab pertanyaan yang berbeda, "Bagaimana cara menghapus gambar yang menggantung?" Pertanyaan OP adalah "Bagaimana cara menghapus gambar tergantung?"
tu-Reinstate Monica-dor duh

6
Untuk menghapus gambar yang menggantung, cukup gunakanprune
Deqing

17
perintah itu tidak lagi berfungsi:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo jika Anda mendapatkan error itu, cobalah mengubah bagian penyaring untuk: --filter=dangling=true. Jika Anda masih mendapatkan kesalahan itu, itu berarti Anda tidak memiliki gambar yang menggantung, sehingga perintah in-set dievaluasi menjadi string kosong.
HammerN'Songs

100

Dalam beberapa kasus (seperti dalam kasus saya), Anda mungkin mencoba menghapus gambar dengan menentukan id gambar yang memiliki banyak tag yang tidak Anda sadari ada, beberapa di antaranya dapat digunakan oleh gambar lain. Dalam hal ini, Anda mungkin tidak ingin menghapus gambar .

Jika Anda memiliki case tag berlebihan seperti yang dijelaskan di sini, alih-alih docker rmi <image_id>gunakan docker rmi <repo:tag>pada tag redundan yang ingin Anda hapus.


11
docker rmi <repo:tag>bekerja untuk saya. Solusi Anda cukup sederhana di antara jawaban-jawaban itu, terima kasih.
Shihe Zhang

ini seharusnya menjadi cara terbaik untuk melakukannya untuk kasus saya untuk remote gambar golang yang lebih tua
temple

Ini tiket untukku, terima kasih. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

Jika ada yang menginstal sampel Microsoft eShopOnContainers, Anda harus menghapus masing-masing dengan cara ini repo:tagkarena itu membuat delapan gambar yang ditandai hanya berbagi dua id gambar. Bahkan Visual Studio tidak akan menghapusnya di jendela manajemen kontainernya ...
mdisibio

Perintah docker rmi <repo:tag>hanya untag , itu tidak serta merta menghapus gambar. Jika ada lebih dari satu tag yang mereferensikan gambar ini, atau jika ada masalah lain seperti misalnya yang dinyatakan oleh OP, gambar itu akan tetap ada. Anda dapat memeriksa bahwa gambar masih ada dengan perintah docker images ls --all.
twan163

50

semua jawaban sebelumnya benar tetapi di sini ada satu solusi yang hanya menghapus semua gambar Anda secara paksa ( gunakan perintah ini dengan risiko Anda sendiri, itu akan menghapus semua gambar Anda )

docker rmi $(docker images -q) -f

masukkan deskripsi gambar di sini


1
Ini bekerja untuk saya; Saya hanya ingin menerbangkan semua gambar lokal saya. Catatan, saya harus memperbarui untuk bekerja dengan versi buruh pelabuhan saya (18.09.7): docker image rm $(docker image ls -a -q) -f
akagixxer

40

temukan id gambar dan id induk untuk semua gambar yang dibuat setelah gambar yang bersangkutan dengan yang berikut:

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

Kemudian Anda memanggil perintah:

docker rmi {sub_image_id} 

"sub_image_id" adalah ID dari gambar tergantung


Jadi bagus untuk menghapus gambar setengah jadi dari gambar tertentu. Terima kasih!!
A.Villegas

flag tidak diketahui - filter: /
SamuraiJack

Ini tampaknya menjadi solusi aktual untuk pertanyaan itu!
Paolo

28

Yang berhasil bagi saya adalah menggunakan kombinasi REPOSITORY: TAG daripada ID IMAGE.

Ketika saya mencoba untuk menghapus gambar buruh pelabuhan dengan perintah docker rmi <IMAGE ID>tanpa wadah yang terkait dengan gambar ini saya mendapat pesan:

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

Saya bisa menghapus dengan sukses ketika saya menggunakan perintah docker rmi RPOSITORY:TAG

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

Memang. Adakah penjelasan mengapa perilaku aneh ini?
RodrigoM

1
Ini juga bekerja untuk saya. Dalam kasus saya, saya memiliki gambar Ubuntu yang ketinggalan zaman, itu tidak direferensikan dalam gambar lain sebagai orangtua, tetapi tetap tidak dapat menghapus. docker rmi 93fd78260bd1gagal, tetapi kemudian docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempberhasil.
Thomas Lobker

bekerja untuk saya, juga memperbarui gambar yang ketinggalan zaman. ada yang tahu mengapa gagal id?
strider

3
Ini tidak benar-benar menghapus gambar. Itu hanya menghilangkan tag duplikat untuk gambar itu (maka pesannya Untagged: ubuntu:18.04v1). Jika Anda melakukannya docker images -a, Anda mungkin akan melihat 3f66bec2c6bfmasih terdaftar. Jika gambar benar-benar dihapus, Anda akan mendapatkan pesanDeleted: 3f66bec2c6bf
wisbucky

17

PERINTAH INI MENGHAPUS SEMUA GAMBAR (GUNAKAN DENGAN HATI-HATI)

Sudahkah Anda mencoba menggunakan --force

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

Kode di atas ini berjalan seperti pesona bahkan doe saya punya masalah yang sama


1
Saya meninggalkan sudo di kedua tempat dan itu bekerja sangat baik bagi saya
user2217751


6

Berikut ini skrip untuk menghapus gambar dan semua gambar yang bergantung padanya.

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

Setelah itu gunakan perintah seperti yang disarankan Nguyen.


4

Membangun metode brute force Simon Brady di sini , jika Anda tidak memiliki banyak gambar, Anda dapat menggunakan fungsi shell ini:

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

dan kemudian menyebutnya menggunakan recursive_remove_image <image-id>.


4
docker rmi <rep:tag>

Ex:

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

docker rmi python: 3.6


3

Ketika saya ingin menghapus beberapa gambar yang tidak terpakai dengan nama "<none>"di docker saya menghadapi masalah unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images. Jadi untuk mengatasi masalah ini:

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

Anda dapat melihat bahwa saya memiliki beberapa Gambar dengan nama javaapp: nama wadah terbaru dan berbeda. Jadi, saya membunuh dan menghapus semua kontainer dari wadah "javaapp: latest" dengan:

sudo docker stop "containerName"

sudo docker rm "containrName"

Kemudian

sudo docker rmi -f "imageId"

Jadi saya bisa menghapus semua gambar dengan nama "<none>"

semoga berhasil


1

Saya juga mendapat masalah ini, saya bisa menyelesaikan masalah dengan perintah di bawah ini. ini mungkin menyebabkan, wadah gambar sedang berjalan atau keluar jadi sebelum menghapus gambar Anda harus menghapus wadah

buruh pelabuhan ps -a -f status = keluar: perintah ini menunjukkan semua kontainer yang keluar jadi salin ID wadah dan kemudian jalankan perintah di bawah ini untuk menghapus wadah

buruh pelabuhan rm #containerId: perintah ini menghapus wadah ini mungkin masalah yang menyebutkan "gambar memiliki gambar anak yang bergantung"

Kemudian cobalah untuk menghapus gambar dengan perintah di bawah ini

buruh pelabuhan rmi #ImageId


1

Saya memiliki masalah ini dan tidak ada jawaban singkat di sini yang berfungsi, bahkan di halaman yang disebutkan oleh @tudor di atas. Saya pikir saya akan berbagi di sini bagaimana saya menyingkirkan gambar. Saya datang dengan gagasan bahwa gambar dependen harus> = ukuran gambar induk, yang membantu mengidentifikasinya sehingga kami dapat menghapusnya.

Saya mencantumkan gambar dalam urutan ukuran untuk melihat apakah saya dapat menemukan korelasi:

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

Apa yang dilakukan, adalah menggunakan beberapa pemformatan khusus dari buruh pelabuhan untuk memposisikan kolom ukuran gambar terlebih dahulu, kemudian jalankan pengurutan yang dapat dibaca manusia dalam urutan terbalik. Lalu saya mengembalikan kolom yang mudah dibaca.

Kemudian saya melihat <none>wadah, dan mencocokkan yang pertama dalam daftar dengan ukuran yang sama. Saya melakukan sederhana docker rmi <image:tag>pada gambar itu dan semua<none> gambar anak pergi bersamanya.

Gambar masalah dengan semua gambar anak sebenarnya myrepo/getstarted-lab gambar sialan yang saya gunakan ketika saya mulai bermain dengan buruh pelabuhan. Itu karena saya telah membuat gambar baru dari gambar uji pertama yang menciptakan rantai.

Semoga itu membantu orang lain di beberapa titik.


1

Misalkan kita memiliki Dockerfile

FROM ubuntu:trusty
CMD ping localhost

Kami membangun gambar dari itu tanpa TAG atau penamaan

docker build .

Sekarang kami memiliki laporan sukses "Berhasil membangun 57ca5ce94d04" Jika kita melihat gambar buruh pelabuhan

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

Kita harus menghapus dulu docker rmi 57ca5ce94d04

Diikuti oleh

docker rmi 8789038981bc

Dengan gambar itu akan dihapus!

Pemindahan paksa semua seperti yang disarankan oleh seseorang

docker rmi $(docker images -q) -f

1

Memperluas jawaban yang disediakan oleh @Nguyen - fungsi ini dapat ditambahkan ke .bashrcdll Anda dan kemudian dipanggil dari commandline untuk membantu membersihkan image has dependent child imageskesalahan ...

Anda dapat menjalankan fungsinya sendiri, dan jika docker psgagal, maka ia akan menjalankan dockerperintah dengan sudodan meminta kata sandi Anda.

Apakah tidak menghapus gambar untuk setiap kontainer berjalan!

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

Saya juga punya ini di .bashrcfile saya ...

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  
}

Bekerja dengan:

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

0

Hapus paksa daftar gambar (tidak termasuk versi 10, misalnya)

gambar buruh pelabuhan | versi grep | grep -v version10> images.txt && untuk img dalam $ (awk -F "" '{print $ 3}' /root/images.txt); lakukan buruh pelabuhan rmi -f $ img; selesai


-1

Anda bisa melakukan ini:

➜ ~ sudo buruh pelabuhan rmi 4ed13257bb55 -f Dihapus: SHA256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Dihapus: SHA256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Dihapus: SHA256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Dihapus: SHA256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

Lapisan Gambar: Gudang sering disebut sebagai gambar atau wadah gambar, tetapi sebenarnya mereka terdiri dari satu atau lebih lapisan. Lapisan gambar dalam repositori terhubung bersama dalam hubungan orangtua-anak. Setiap lapisan gambar mewakili perubahan antara dirinya dan lapisan induk.

Pola bangunan buruh pelabuhan menggunakan warisan . Itu berarti versi itergantung pada versi i-1. Jadi, kita harus menghapus versi i+1untuk dapat menghapus versi i. Ini adalah ketergantungan yang sederhana.

Jika Anda ingin menghapus semua gambar kecuali yang terakhir (yang paling diperbarui) dan yang pertama (basis) maka kami dapat mengekspor yang terakhir (yang paling diperbarui) menggunakan docker saveperintah seperti di bawah ini.

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

Lalu, sekarang, hapus semua gambar menggunakan image-id seperti di bawah ini.

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

Sekarang, muat gambar tgz Anda yang disimpan seperti di bawah ini.

gzip -c <output_file.tgz> | docker load

lihat id gambar dari gambar Anda yang dimuat menggunakan buruh pelabuhan ps -q. Tidak ada tag dan nama. Anda cukup memperbarui tag dan nama seperti yang dilakukan di bawah ini.

docker tag <image_id> group_name/name:tag
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.