Bagaimana menghapus gambar Docker lama dan tidak terpakai

762

Saat menjalankan Docker untuk waktu yang lama, ada banyak gambar dalam sistem. Bagaimana saya bisa menghapus semua gambar Docker yang tidak digunakan sekaligus keamanan untuk membebaskan penyimpanan?

Selain itu, saya juga ingin menghapus gambar yang ditarik bulan lalu, yang sudah benar TAG.

Jadi, saya tidak meminta untuk menghapus gambar yang tidak ditandai saja. Saya sedang mencari cara untuk menghapus gambar umum yang tidak digunakan, yang mencakup gambar yang tidak diberi tag dan gambar lain seperti yang ditarik berbulan-bulan yang lalu dengan benar TAG.

Quanlong
sumber

Jawaban:

1402

Pembaruan September 2016: Docker 1.13: PR 26108 dan komit 86de7c0 memperkenalkan beberapa perintah baru untuk membantu memfasilitasi memvisualisasikan berapa banyak ruang yang diambil data daemon buruh pelabuhan pada disk dan memungkinkan untuk dengan mudah membersihkan kelebihan "yang tidak dibutuhkan".

docker system pruneakan menghapus SEMUA data yang menggantung (mis. Agar: kontainer berhenti, volume tanpa wadah dan gambar tanpa wadah). Bahkan data yang tidak digunakan, dengan -aopsi.

Anda juga memiliki:

Untuk gambar yang tidak digunakan , gunakan docker image prune -a(untuk menghapus gambar yang menggantung dan tidak diberi gambar).
Peringatan: ' tidak digunakan ' berarti "gambar tidak dirujuk oleh wadah apa pun": hati-hati sebelum menggunakan -a.

Seperti digambarkan dalam AL 's jawaban , docker system prune --allakan menghapus semua terpakai gambar bukan hanya menggantung orang ... yang dapat sedikit terlalu banyak.

Menggabungkan docker xxx prunedengan --filteropsi bisa menjadi cara yang bagus untuk membatasi pemangkasan ( buruh pelabuhan SDK API 1.28 minimum, jadi buruh pelabuhan 17.04+ )

Filter yang saat ini didukung adalah:

  • until (<timestamp>) - hanya menghapus wadah, gambar, dan jaringan yang dibuat sebelum stempel waktu yang diberikan
  • label( label=<key>, label=<key>=<value>, label!=<key>, Atau label!=<key>=<value>) - hanya menghapus kontainer, gambar, jaringan, dan volume dengan (atau tanpa , dalam kasus label!=...digunakan) label yang ditentukan.

Lihat " Pangkas gambar " untuk contohnya.


Jawaban asli (Sep. 2016)

Saya biasanya melakukan:

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

Saya memiliki alias untuk menghapus [gambar menggantung] 13 :drmi

The dangling=trueFilter menemukan gambar yang tidak terpakai

Dengan begitu, gambar perantara apa pun yang tidak lagi dirujuk oleh gambar berlabel dihapus.

Saya melakukan hal yang sama terlebih dahulu untuk proses yang keluar (wadah)

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

Sebagai haridsv poin di komentar :

Secara teknis, Anda harus terlebih dahulu membersihkan wadah sebelum membersihkan gambar, karena ini akan menangkap lebih banyak gambar yang menggantung dan lebih sedikit kesalahan .


Jess Frazelle (jfrazelle) memiliki fungsi bashrc :

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

Untuk menghapus gambar-gambar lama, dan bukan hanya gambar-gambar yang "tidak direferensikan", Anda dapat mempertimbangkan docker-gc:


Wadah Docker sederhana dan skrip pengumpulan sampah gambar.

  • Kontainer yang keluar lebih dari satu jam yang lalu dihapus.
  • Gambar yang bukan milik wadah yang tersisa setelah itu dihapus.
VONC
sumber
29
Apakah ada dokumentasi tentang apa yang "dangling=true"sebenarnya berarti?
CivFan
1
Skrip ini tidak dapat menghapus beberapa gambar yang ditarik berbulan-bulan yang lalu
Quanlong
2
dcleanupMengagumkan!
Quanlong
4
@herm Pertama, docker system prunemenghapus lebih dari sekedar gambar. Pastikan untuk menggunakannya docker image prunesebagai gantinya. Dan berhati - hatilah dengan -a: a docker system prune -adapat memiliki efek yang menghancurkan (menghilangkan volume juga). Akhirnya, ya, -amenghapus gambar yang tidak digunakan, saya akan mengedit jawabannya.
VonC
2
@stom: 'tidak digunakan' berarti "gambar tidak direferensikan oleh wadah apa pun, tetapi menggantung berarti tidak ditandai sama sekali (hanya sebuah id).
VonC
125

Perbarui yang kedua (2017-07-08):

Rujuk (lagi) ke VonC, gunakan yang lebih baru lagi system prune. Yang tidak sabar bisa melewatkan prompt dengan -f, --forceopsi:

docker system prune -f

Selain itu, tidak sabaran dan sembrono dapat menghapus "gambar yang tidak terpakai bukan hanya yang menggantung" dengan -a, --allopsi:

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

Memperbarui:

Lihat jawaban VonC yang menggunakan pruneperintah yang baru ditambahkan . Inilah kenyamanan alias shell yang sesuai:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

Jawaban lama:

Hapus wadah yang terhenti (keluar):

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

Hapus gambar (menggantung) yang tidak digunakan:

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

Jika Anda telah menggunakan sangat hati-hati sehubungan dengan kehilangan data yang tidak dapat dibatalkan , maka Anda dapat menghapus volume yang tidak digunakan (menggantung) (v1.9 dan lebih tinggi):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

Di sini mereka berada dalam alias shell yang mudah:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

Referensi:

rubik
sumber
3
Saya akan berhati-hati dengan pembersihan volume. Baik volume kontainer yang dibuat secara otomatis dan volume yang dinamai yang saat ini tidak digunakan terdaftar bersama-sama dengan dangling = true.
BMitch
1
@BMitch, Anda benar sekali; Saya telah menambahkan peringatan keras ke docker volume rmresep. Saya akan menyambut setiap saran yang Anda miliki.
rubik
1
Saya ingin buruh pelabuhan memberi kami opsi filter berbeda untuk volume yang disebutkan. Jika saya menemukan solusi yang baik, saya pasti akan berbagi.
BMitch
2
ya, tapi sayangnya itu tidak memisahkan volume bernama dari volume wadah anonim dengan bendera sederhana. Perintah yang saya gunakan adalah docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rmyang akan berfungsi selama Anda tidak pernah memberi nama volume Anda dengan sesuatu yang mirip dengan panduan. Saya dapat mengubah ini untuk sintaks filter yang baru.
BMitch
1
Menghapus volume yang tidak digunakan (menggantung) sangat membantu kami!
Kane
61

Untuk menghapus gambar dengan tag lama yang berumur lebih dari sebulan:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

Perhatikan bahwa itu akan gagal untuk menghapus gambar yang digunakan oleh sebuah wadah, direferensikan dalam repositori, memiliki gambar anak yang tergantung ... yang mungkin Anda inginkan. Lain hanya menambahkan -fbendera.

Contoh /etc/cron.daily/docker-gcskrip:

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm
Wernight
sumber
2
+1 Untuk perintah untuk menghapus gambar buruh pelabuhan yang lama. Agak gila, tapi solusinya asli dan bekerja dengan sangat baik :)
Rick
3
Ini bagus namun saya pikir ini hanya menghapus gambar buruh pelabuhan yang berusia minimal 4 bulan . .CreatedSincemenggunakan minggu sebagai satuan waktu dalam output bahkan pada gambar yang banyak minggu, misalnya 12 weeks.
joelittlejohn
2
Ini bekerja untuk saya, baik dan sederhana:docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
Kent Bull
34

Jawaban lainnya bagus, khususnya:

docker system prune # doesn't clean out old images
docker system prune --all # cleans out too much

Tetapi saya membutuhkan sesuatu di tengah-tengah kedua perintah itu sehingga filterpilihannya adalah apa yang saya butuhkan:

docker image prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

Semoga itu bisa membantu :)

Untuk referensi: https://docs.docker.com/config/pruning/#prune-images

Zhao Li
sumber
1
Jawaban yang sangat diremehkan! Mampu memangkas dengan tanggal cutoff sangat berguna.
Nik Reiman
24

Dengan anggapan Anda memiliki Docker 1.13 atau lebih tinggi, Anda bisa menggunakan perintah prune. Untuk pertanyaan Anda secara khusus untuk menghapus gambar lama, Anda ingin yang pertama.

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

Saya akan merekomendasikan untuk tidak terbiasa menggunakan docker system pruneperintah. Saya rasa pengguna tidak sengaja akan menghapus hal-hal yang tidak mereka maksudkan. Secara pribadi, saya terutama akan menggunakan perintah docker image prunedan docker container prune.

Programster
sumber
4
Anda tidak ingin memangkas jaringan yang tidak digunakan, bukan? seperti, jika semua kontainer dihentikan, dan saya menghapus jaringan itu, bagaimana kontainer itu bekerja jika saya memulainya. Apakah jaringan dibuat bersama dengan docker run?
meffect
@ efek Saya sepenuhnya setuju dan tuhan spot bahwa saya telah meninggalkan jaringan pemangkasan. Saya telah memasukkan itu dan menambahkan bagian di akhir yang menyatakan bahwa saya tidak akan merekomendasikan menggunakan docker system prunekecuali buah plum.
Programster
15

Sampai sekarang (Docker versi 1.12) kami menggunakan perintah berikut untuk menghapus semua kontainer yang berjalan. Juga, jika kita ingin menghapus volume, kita dapat melakukannya secara manual menggunakan masing-masing tag -v pada perintah berikut.

Hapus semua Kontainer yang Keluar

docker rm $(docker ps -q -f status=exited)

Hapus semua Kontainer yang Dihentikan

docker rm $(docker ps -a -q)

Hapus Semua Running dan Stop Kontainer

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Hapus semua wadah, tanpa kriteria apa pun

docker container rm $(docker container ps -aq)

Namun, dalam versi 1.13 dan di atas, untuk sistem lengkap dan pembersihan, kita dapat langsung menggunakan perintah berikut:

docker system prune

Semua wadah, gambar, jaringan, dan volume yang tidak digunakan akan dihapus. Kita juga bisa melakukan ini menggunakan perintah berikut yang membersihkan komponen individu:

docker container prune
docker image prune
docker network prune
docker volume prune
mohan08p
sumber
14

Ini bekerja untuk saya:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Mahmoud Zalt
sumber
13

Perintah berikut akan menghapus gambar yang lebih lama dari 48 jam.

$ docker image prune --all --filter until=48h
Shree Prakash
sumber
1
Menggunakan filter juga dimungkinkan untuk mendaftar setiap versi sebelum versi yang ditentukan: docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8dan kemudian menerapkan perintah rmi untuk menghapus. docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
rodvlopes
9

Baru-baru ini saya menulis skrip untuk menyelesaikan ini di salah satu server saya:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done
Ell Neal
sumber
8

Berikut ini adalah skrip untuk membersihkan gambar Docker dan mendapatkan kembali ruang tersebut.

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

docker rmi $(docker images -f "dangling=true" -q)

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

Naskah asli

https://github.com/vishalvsh1/docker-image-cleanup

Biasanya Docker menyimpan semua file sementara yang terkait dengan bangunan gambar dan lapisan

/ var / lib / docker

Jalur ini bersifat lokal ke sistem, biasanya di partisi root, "/" .

Anda dapat memasang ruang disk yang lebih besar dan memindahkan konten /var/lib/dockerke lokasi pemasangan yang baru dan membuat tautan simbolis.

Dengan cara ini, bahkan jika gambar Docker menempati ruang, itu tidak akan mempengaruhi sistem Anda karena akan menggunakan beberapa lokasi pemasangan lainnya.

Posting asli: Kelola gambar Docker pada disk lokal

vishal sahasrabuddhe
sumber
6

Saya menggunakan perintah ini:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

Ini akan menghapus semua gambar yang waktu pembuatannya lebih besar dari 10 minggu yang lalu.

Yonatan Kiron
sumber
Saya pikir Anda bertukar IMAGE_CTIMEdan BEFORE_DATETIMEdalam echoperintah itu
Udo G
5

Jika Anda ingin menghapus gambar yang ditarik X bulan lalu, Anda dapat mencoba contoh di bawah ini yang menghapus gambar yang dibuat tiga bulan lalu:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images
spectre007
sumber
1
Ini tidak benar. Ini menghapus gambar yang dibuat 3 bulan lalu, bukan gambar yang ditarik 3 bulan yang lalu (jika Anda menariknya dari sumber jarak jauh, mereka sudah bisa langsung berusia 3 bulan).
Andrew Ferrier
Ini membantu saya membuat lebih banyak filter, berdasarkan kriteria yang berbeda
david.sansay
4

Untuk memangkas semua gambar dan volume juga
docker system prune -af --volumes

Zaytsev Dmitry
sumber
3

docker system prune -a

(Anda akan diminta untuk mengkonfirmasi perintah. Gunakan -funtuk memaksa lari, jika Anda tahu apa yang Anda lakukan.)

Vojtech Vitek
sumber
5
Ini berbahaya , lihat komentar lain tentang docker system prunemenghapus bahkan volume bernama -a.
RichVel
3

@VonC sudah memberikan jawaban yang sangat bagus, tetapi untuk kelengkapan di sini adalah skrip kecil yang telah saya gunakan --- dan yang juga nukes setiap proses tugas Docker jika Anda memiliki beberapa:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi
Dirk Eddelbuettel
sumber
Bekerja dengan baik tetapi masih bisa didapat Error response from daemon: You cannot remove a running container. Ditambahkan docker kill $(docker ps -q)sebelum baris 3 ke alamat
Vincent
Mengapa tidak menggunakan $(docker images -q)bukan $(docker images | awk '/<none>/ { print $3 }')?
SeF
1
@ SeF: Jika saya lakukan docker images -qsaya mendapatkan vektor id gambar, tidak ada yang lain. Jika saya melakukan apa yang saya lakukan, saya mendapatkan lebih banyak - memungkinkan saya untuk memfilter <none>seperti yang saya lakukan di sini. Masuk akal?
Dirk Eddelbuettel
2

Untuk menghapus gambar yang ditandai tanpa wadah berjalan, Anda harus menggunakan sedikit skrip:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done
ospider
sumber
2

Hapus wadah lama beberapa minggu yang lalu.

docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

Hapus gambar lama minggu lalu. Hati-hati. Ini akan menghapus gambar dasar yang dibuat beberapa minggu yang lalu tetapi mungkin menggunakan gambar baru Anda.

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')

Antony.H
sumber
2

Cara menghapus gambar yang ditandai

  1. buruh pelabuhan rmi tag pertama

  2. buruh pelabuhan rmi gambar.

    # yang dapat dilakukan dalam satu panggilan rmi docker mis .: # docker rmi <repo: tag> <imageid>

(ini berfungsi November 2016, Docker versi 1.12.2)

misalnya

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

mis. Script menghapus sesuatu yang lebih dari 2 minggu.

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done
gaoithe
sumber
2
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)

kekuatan f

-semua

-q dalam mode

Hamit YILDIRIM
sumber
1
docker rm `docker ps -aq`

atau

docker rm $(docker ps -q -f status=exited)
mainframer
sumber
3
Saya pikir jawaban ini berbahaya karena perintah-perintah itu menghapus kontainer. Pertama, OP bertanya bagaimana menghapus gambar, bukan wadah. Dan yang lebih penting, perintah-perintah itu dapat menyebabkan hilangnya data karena orang-orang mungkin memiliki beberapa data berharga dalam wadah yang sudah tidak ada.
u.unver34
Anda harus menggambarkan hasil yang mungkin tidak diinginkan dari penerapan perintah ini di server produksi.
Daniel
ini menghilangkan wadah, bukan gambar.
SeF
1

Kadang-kadang saya mengalami masalah di mana Docker akan mengalokasikan dan terus menggunakan ruang disk, bahkan ketika ruang tersebut tidak dialokasikan untuk gambar tertentu atau wadah yang ada. Cara terbaru yang saya buat untuk masalah ini secara tidak sengaja adalah menggunakan centos build "docker-engine" alih-alih "docker" di RHEL 7.1. Apa yang tampaknya terjadi adalah kadang-kadang pembersihan wadah tidak selesai dengan sukses dan kemudian ruang tidak pernah digunakan kembali. Ketika drive 80GB saya alokasikan sebagai / diisi dengan file / var / lib / docker saya harus datang dengan cara kreatif untuk menyelesaikan masalah.

Inilah yang saya pikirkan. Pertama yang menyelesaikan kesalahan penuh disk:

  1. Stop docker: systemctl stop docker
  2. Mengalokasikan drive baru yang dipasang sebagai say / mnt / docker.
  3. Pindahkan semua file di / var / lib / docker ke / mnt / docker. Saya menggunakan perintah: rsync -aPHSx --remove-source-files / var / lib / buruh pelabuhan / / mnt / buruh pelabuhan /
  4. Pasang drive baru ke / var / lib / docker.

Pada titik ini saya tidak lagi memiliki disk penuh kesalahan, tetapi saya masih menyia-nyiakan banyak ruang. Langkah selanjutnya adalah mengatasinya.

  1. Start Docker: systemctl start docker

  2. Simpan semua gambar: buruh pelabuhan simpan $ (gambar buruh pelabuhan | sed -e '/ ^ / d' -e '/ ^ REPOSITORI / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img

  3. Copot pemasangan buruh pelabuhan.

  4. Hapus semua yang ada di / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *

  5. Pasang kembali buruh pelabuhan

  6. Aktifkan buruh pelabuhan: systemctl mengaktifkan buruh pelabuhan

  7. Mulai buruh pelabuhan: systemctl mulai buruh pelabuhan

  8. Pulihkan gambar: memuat buruh pelabuhan </root/docker.img

  9. Mulai wadah persisten yang Anda perlu jalankan.

Ini menurunkan penggunaan disk saya dari 67 GB untuk buruh pelabuhan menjadi 6 GB untuk buruh pelabuhan.

Saya tidak merekomendasikan ini untuk penggunaan sehari-hari. Tapi ini berguna untuk dijalankan ketika sepertinya docker telah kehilangan jejak ruang disk yang digunakan untuk kesalahan perangkat lunak, atau reboot yang tidak terduga.

briemers
sumber
1

Jika Anda ingin secara otomatis / berkala membersihkan wadah yang keluar dan menghapus gambar dan volume yang tidak digunakan oleh wadah yang sedang berjalan, Anda dapat mengunduh gambar meltwater/docker-cleanup .

Lari saja:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Ini berjalan setiap 30 menit secara default. Namun Anda dapat mengatur waktu tunda dengan menggunakan bendera ini dalam detik (DELAY_TIME = 1800 opsi).

Lebih detail: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Anigbo yang tidak bersalah
sumber
1

Jika Anda membuat sendiri gambar yang dipangkas ini (dari beberapa gambar dasar lain yang lebih tua) harap berhati-hati dengan solusi yang diterima di atas berdasarkan docker image prune, karena perintahnya tumpul dan akan mencoba untuk menghapus juga semua dependensi yang diperlukan oleh gambar terbaru Anda (perintah harus mungkin berganti nama menjadidocker image*s* prune ).

Solusi yang saya gunakan untuk pipelines build image docker saya (di mana ada builds harian dan tag = tanggal dalam YYYYMMDDformat) adalah ini:

# carefully narrow down the image to be deleted (to avoid removing useful static stuff like base images)
my_deleted_image=mirekphd/ml-cpu-py37-vsc-cust

# define the monitored image (tested for obsolescence), which will be usually the same as deleted one, unless deleting some very infrequently built image which requires a separate "clock"
monitored_image=mirekphd/ml-cache

# calculate the oldest acceptable tag (date)
date_week_ago=$(date -d "last week" '+%Y%m%d')

# get the IDs of obsolete tags of our deleted image
# note we use monitored_image to test for obsolescence
my_deleted_image_obsolete_tag_ids=$(docker images --filter="before=$monitored_image:$date_week_ago" | grep $my_deleted_image | awk '{print $3}')

# remove the obsolete tags of the deleted image
# (note it typically has to be forced using -f switch)
docker rmi -f $my_deleted_image_obsolete_tag_ids
mirekphd
sumber
0

Ada sparrow plugin docker-remove-dangling-images yang dapat Anda gunakan untuk membersihkan kontainer yang berhenti dan gambar yang tidak terpakai (dangling):

$ sparrow plg run docker-remove-dangling-images

Ini berfungsi baik untuk Linux dan OS Windows.

Alexey Melezhik
sumber
0

Lari pertama docker images untuk melihat daftar gambar dan menyalin IMAGE HASH ID ke clipboard.

Lari docker rmi -f <Image>

Ingat opsi -fadalah penghapusan paksa.

Le Khiem
sumber