Bagaimana cara menghapus gambar buruh pelabuhan berdasarkan nama?

94

Saya ingin menghapus semua versi gambar buruh pelabuhan dengan nama yang mengandung string yang diberikan ( imagename).
Saya telah mencoba yang di bawah ini, tetapi sepertinya tidak berhasil:

docker images | grep 'imagename' | xargs -I {} docker rmi

Aditya Singh
sumber

Jawaban:

136

Coba yang berikut ini:

docker rmi $(docker images |grep 'imagename')

Windows Powershell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
Pengembara
sumber
17
Versi terbaru dari Docker mendukung ini (tanpa grep): docker rmi $ (docker images 'imagename')
Charlie
Versi Docker saat ini tampaknya mendukung ini - mungkin saya melewatkan sesuatu? - buruh pelabuhan rmi 'imagename'
Charlie
10
@Charlie Saya rasa kebanyakan orang mencari cara untuk mencocokkan semua gambar yang cocok dengan ' imagename ' daripada satu gambar bernama persis 'imagename'.
RJFalconer
1
Saya mendapatkan kesalahan berikut ini: "docker rmi memerlukan setidaknya 1 argumen."
michali
@michali Artinya tidak ada gambar yang cocok yang dikembalikan. Dapatkah Anda memverifikasi bahwa ada entri yang cocok dengan hanya menjalankan:docker images |grep 'imagename'
Rambler
72

Versi yang sedikit lebih tepat - grep hanya pada nama repositori:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Elton Stoneman
sumber
25
ini hanya menghapus gambar yang ditandai sebagai yang terbarudocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew
Terima kasih! Inilah yang saya cari.
Hardhik
26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
theoneandonlyak
sumber
1
Bisakah Anda menjelaskan apa fungsinya? Potongan kode acak bisa berbahaya.
kilojoule
6
docker images --format '{{.Repository}}:{{.Tag}}memfilter keluaran sehingga hanya repo & tag yang ditampilkan (yaitu foo:latest). grep 'imagenamememfilter baris tersebut hanya untuk gambar yang berisi imagename. Menempatkan itu di $()mengevaluasi itu & lolos ke luar docker rmiyang menghapus gambar-gambar yang cocok.
Adam Parkin
Memperluas di atas, Anda dapat menghapus semua gambar yang diberi tag sesuai dengan nama gambar yang tepat sebagai berikut:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins
1
di windows "grep" tidak ada (cmd atau powershell) Berikut ini dapat digunakan pada jandadocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan
20

docker imagessebenarnya menggunakan argumen posisi pertama sebagai nama gambar untuk difilter. Tidak perlu grep dan awk. The -qpilihan akan kembali hanya gambar pencocokan ID yang dapat diumpankan ke docker rmi.

docker rmi --force $(docker images -q 'imagename' | uniq)

The uniqdiperlukan untuk menghapus duplikat, jika Anda memiliki gambar yang sama ditandai berbeda.

udondan
sumber
Ini pasti pilihan terbaik hari ini. Untuk menjaga konsistensi pertanyaan meskipun imagename harus dalam tanda kutip.
Colm Bhandal
8

Cukup Anda dapat menambahkan --forcedi akhir perintah. Suka:

sudo docker rmi <docker_image_id> --force

Untuk membuatnya lebih cerdas, Anda dapat menghentikan semua container yang sedang berjalan sebelum menghapus gambar:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Di docker ps, $ 1 adalah kolom pertama yaitu ID kontainer buruh pelabuhan dan $ 3 adalah kolom ke-3 yaitu id gambar buruh pelabuhan

kushalbhattad
sumber
5

Saya menemukan jawaban saya lebih sederhana.

Contoh, nama gambar Anda adalah python_image.

Maka kode Anda harus :

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

Saya harap ini membantu.

Reamon C. Sumapig
sumber
Bisakah kita melakukan ini untuk beberapa gambar berdasarkan nama wildcard?
variabel
3

Saya juga mendapat jawaban singkat lainnya. Satu-satunya perubahan adalah menghapus -I {}bendera yang tidak perlu .

docker images | grep 'imagename' | xargs docker rmi

Aditya Singh
sumber
3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

Ini akan menghapus semua gambar dengan nama "imageName". Dalam beberapa kasus, ini mungkin memberikan kesalahan seperti "gambar direferensikan di satu atau lebih repositori". Dalam hal ini gunakan hapus paksa.

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

Cara lain bisa dengan:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'
zaman sakib
sumber
3

Untuk beberapa alasan saya tidak dapat menggunakan jawaban yang diberikan di sini. Inilah yang berhasil untuk saya.

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'adalah bagian penting. Ini mengekstrak id dari kolom ke-3.

sergeyz.dll
sumber
3

Bagi saya bekerja ( Docker versi 19.03.5 ):

docker rmi $(docker images 'imagename' -q)

Perintah " docker images 'imagename' -q " akan menampilkan semua gambar id dari argumen kutip tunggal sehingga menggabungkannya dengan docker rmi (atau docker rmi -f untuk memaksa) itu akan menghapus semua gambar dengan nama yang dipilih

Giuse Petroso
sumber
1
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
Michael A.
sumber
0

Komentar kecil: Dari apa yang kami alami, tampaknya Anda - sejak buruh pelabuhan 18.03 - tidak lagi dapat menghapus gambar yang tidak diberi tag hanya berdasarkan namanya. Anda juga perlu menggunakan nama + tag seperti yang disebutkan di atas atau menggunakan ID.

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'
Tim Chaubet
sumber
0

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

misalnya jika saya memiliki gambar berikut

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abcdefg/hij                   7.0.0-beta-4.0      3128835950cd        7 days ago          51.4MB
abcdefg/hij-action            7.0.0-beta-4.0      42a7255beb74        7 days ago          97.4MB
abcdefg/hij-test              7.0.0-beta-4.0      17246aed35d0        7 days ago          97.4MB
abcdefg/hij-server            7.0.0-beta-4.0      42c45e561f2c        7 days ago          335MB
abcdefg/hij-init              7.0.0-beta-3.0      f648bb622933        7 days ago          55.2MB
abcdefg/hij-dir               7.0.0-beta-3.0      0db07d3aaccf        7 days ago          97.4MB
abcdefg/hij-mount             7.0.0-beta-3.0      18d1c0e1502c        4 weeks ago         33.7MB

Kemudian docker rmi $(docker images --filter=reference="abcd*:*4.0")akan menghapus empat gambar pertama.

Informasi lebih lanjut silakan lihat https://docs.docker.com/engine/reference/commandline/images/

HarryQ
sumber
berfungsi, tetapi akan lebih baik untuk menambahkan '-q' ke perintah gambar buruh pelabuhan: docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger
0

Kumpulkan solusi untuk pertanyaan ini untuk memenuhi kebutuhan saya, yang tidak pernah diposting sebelumnya.

Saya ingin mencocokkan lokal dibangun gambar: library/myappbahwa saya telah berganti nama, tag, dan mendorong ke repo pribadi: myrepo.org/library/myapp. Setelah mereka didorong, saya ingin membersihkan reg. Buruh pelabuhan lokal.

Dan saya tidak peduli jika tidak ada yang ditemukan atau perintah membuat kesalahan. Demikian ditambahkan || truedi akhir untuk dimasukkan ke dalam skrip.

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
John
sumber
0

Berdasarkan jawaban @ Aditya, Anda juga dapat membuat fungsi bash untuk menghapus gambar dengan mudah. Letakkan fungsi ini di file ~/.profile. Buat sesi shell baru atau sumber dengan source ~/.profile.

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

Pemakaian:

drmi golang
Halil Kaskavalci
sumber
0

Informasi:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)

Berikan kesalahan ini:

Tanggapan kesalahan dari daemon: format referensi tidak valid

Mungkin karena gambar saya terlihat seperti ini:

hostname:5000/imagename:<none>

Saya harus menggunakan id gambar dan melakukan perintah ini:

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

Untuk membuang kontainer yang sudah keluar:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Martin P.
sumber