Dockerを長時間実行していると、システムにたくさんのイメージがあります。未使用のDockerイメージを安全に一度に削除してストレージを解放するにはどうすればよいですか。
さらに、数か月前に取得した、正しいTAG
を持つ画像も削除したいと思います。
だから、私はタグなしの画像だけを削除することを求めていません。私は、タグ付けされていない画像や、数ヶ月前に正しいTAG
で引っ張られた画像など、未使用の一般的な画像を削除する方法を探しています。
2016年9月の更新:Docker 1.13: PR 26108 および commit 86de7c いくつかの新しいコマンドを導入して、Dockerデーモンデータがディスク上で占有している容量を視覚化するのに役立つ「不要な」過剰を簡単にクリーンアップします。
docker system Prune
は、すべてのダングリングデータを削除します(つまり、順序:コンテナが停止し、コンテナのないボリュームとコンテナのないイメージ)。 -a
オプションを使用した未使用データでも。
あなたも持っています:
未使用画像の場合は、docker image Prune -a
を使用します(ぶら下がりand未使用画像を削除するため)。
警告: 'nused'は「コンテナによって参照されていないイメージ」を意味します。-a
を使用する前に注意してください。
AL の answer に示すように、docker system Prune --all
はすべてのnused画像を削除します。
docker xxx Prune
と --filter
オプション の組み合わせは、プルーニングを制限するための優れた方法です( docker SDK API 1.28最小、したがってdocker 17.04 + )
現在サポートされているフィルターは次のとおりです。
until (<timestamp>)
-指定されたタイムスタンプの前に作成されたコンテナ、画像、およびネットワークのみを削除しますlabel
(label=<key>
、label=<key>=<value>
、label!=<key>
、またはlabel!=<key>=<value>
)-コンテナー、イメージ、ネットワーク、およびボリュームのみを削除します(またはlabel!=...
を使用する場合はwithoutを使用)。例については、「 Prune images 」を参照してください。
元の回答(2016年9月)
私は通常:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
それらの[ダングリングイメージ]を削除するためのエイリアス1 :drmi
dangling=true
フィルターは未使用の画像を検出します
これにより、ラベル付き画像によって参照されなくなった中間画像は削除されます。
終了したプロセス(コンテナ) に対して同じfirstを行う
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
技術的には、最初にコンテナをクリーンアップしてからイメージをクリーンアップする必要があります。これにより、より多くのぶら下がりイメージが検出され、エラーが少なくなります。
Jess Frazelle(jfrazelle) には 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
}
「参照されていない」イメージだけでなく、古いイメージを削除するには、 docker-gc
を検討できます。
シンプルなDockerコンテナーとイメージガベージコレクションスクリプト。
- 1時間以上前に終了したコンテナは削除されます。
- その後、残りのコンテナに属さない画像は削除されます。
2番目を更新します(2017-07-08):
さらに最近のsystem Prune
を使用して、(再び)VonCを参照してください。せっかちな人は-f, --force
オプションでプロンプトをスキップすることができます。
docker system Prune -f
せっかちとrecklessは-a, --all
オプションで "ぶら下がっているものだけでなく未使用の画像"を追加で削除することができます:
docker system Prune -af
https://docs.docker.com/engine/reference/commandline/system_Prune/
更新:
最近追加されたPrune
コマンドを使用する VonCの答え を参照してください。これは対応するシェルエイリアスの便利さです。
alias docker-clean=' \
docker container Prune -f ; \
docker image Prune -f ; \
docker network Prune -f ; \
docker volume Prune -f '
古い答え:
停止した(終了した)コンテナを削除します。
$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm
未使用の(ぶら下がっている)画像を削除します。
$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi
取消不能なデータ損失 に関して 細心の注意 を行使した場合は、未使用の(未使用の)ボリュームを削除できます(v1.9)。そしてアップ):
$ docker volume ls -qf "dangling=true" | xargs docker volume rm
ここでは、それらは便利なシェルエイリアスにあります。
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'
参考文献:
1ヶ月以上前の old tagged imagesを削除するには:
$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
| grep ' months' | awk '{ print $1 }' \
| xargs --no-run-if-empty docker rmi
リポジトリで参照されているコンテナによって使用されている画像を削除するには fail を使用します。そうでない場合は、-f
フラグを追加するだけです。
/etc/cron.daily/docker-gc
スクリプトの例:
#!/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
Docker 1.13 またはそれ以上のバージョンを持っていると仮定すると、単にPruneコマンドを使うことができます。特に古い画像を削除するためのあなたの質問のために、あなたは最初のものが欲しいです。
# 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
私はnotがdocker system Prune
コマンドの使用に慣れることをお勧めします。ユーザーが誤って意図しないものを削除してしまうと思います。個人的には、主にdocker image Prune
およびdocker container Prune
コマンドを使用します。
他の答えは、特に素晴らしいです。
docker system Prune # doesn't clean out old images
docker system Prune --all # cleans out too much
しかし、2つのコマンドの中間に何か必要なので、filter
オプションが必要でした。
docker image Prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months
それが役立つことを願っています:)
これは私のために働いた:
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
今まで(Dockerバージョン1.12)、実行中のすべてのコンテナを削除するために次のコマンドを使用しています。また、ボリュームを削除したい場合は、次のコマンドでそれぞれのタグ-vを使用して手動で削除できます。
終了したコンテナをすべて削除
docker rm $(docker ps -q -f status=exited)
停止したコンテナをすべて削除
docker rm $(docker ps -a -q)
実行中および停止中のすべてのコンテナを削除
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
条件なしですべてのコンテナを削除
docker container rm $(docker container ps -aq)
しかし、バージョン1.13以降では、完全なシステムとクリーンアップのために、次のコマンドを直接使うことができます。
docker system Prune
未使用のコンテナ、イメージ、ネットワーク、ボリュームはすべて削除されます。個々のコンポーネントをクリーンアップする次のコマンドを使用してこれを行うこともできます。
docker container Prune
docker image Prune
docker network Prune
docker volume Prune
私は最近私のサーバーの一つでこれを解決するためのスクリプトを書きました:
#!/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
Dockerの画像を整理してスペースを取り戻すためのスクリプトです。
#!/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.
オリジナルの台本
https://github.com/vishalvsh1/docker-image-cleanup
通常Dockerは画像の構築とレイヤーに関連するすべての一時ファイルを
/var/lib/docker
このパスはシステムに対してローカルで、通常はルートパーティションの "/" です。
もっと大きなディスク容量をマウントして/var/lib/docker
の内容を新しいマウント位置に移動してシンボリックリンクを作成することができます。
こうすれば、たとえDockerイメージがスペースを占有していても、他のマウント位置を使用することになるのでシステムには影響しません。
私はこのコマンドを使っています:
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
これにより、作成時間が10週間以上前の画像がすべて削除されます。
Xヶ月前に引っ張った画像を削除したい場合は、3か月前に作成した画像を削除する以下の例を試すことができます。
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
数週間前に古い容器を取り除いてください。
docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')
数週間前に古い画像を削除します。注意してください。これは数週間前に作成されたがあなたの新しい画像が使用しているかもしれないベース画像を削除します。
docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')
タグ付き画像を削除する方法
docker rmi最初のタグ
港湾労働者のRMI画像。
#1つのdocker rmi callで実行できる例:# docker rmi <repo:tag> <imageid>
(これは2016年11月に動作する、Dockerバージョン1.12.2)
例えば.
$ 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
例えば2週間以上経過したものをスクリプトで削除します。
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
@VonCはすでにとてもいい答えを出していますが、完全を期すためにここで使用している小さなスクリプトを示します。
#!/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
docker system Prune -a
(コマンドを確認するように求められます。実行していることがわかっている場合は、強制的に実行するには-f
を使用してください)
コンテナが動作していないタグ付き画像を削除するには、小さなスクリプトを使用する必要があります。
#!/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
docker rm `docker ps -aq`
または
docker rm $(docker ps -q -f status=exited)
自動的にまたは定期的に既存のコンテナをクリーンアップし、実行中のコンテナで使用されていないイメージとボリュームを削除したい場合は、イメージmeltwater/docker-cleanup
をダウンロードできます。
とにかく走れ:
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
デフォルトでは30分ごとに実行されます。ただし、秒単位でこのフラグを使用することで遅延時間を設定できます(DELAY_TIME = 1800オプション)。
より多くの詳細: https://github.com/meltwater/docker-cleanup/blob/master/README.md
すべての画像とボリュームも整理するdocker system Prune -af --volumes
ときどき、特定のイメージや既存のコンテナにスペースが割り当てられていなくても、Dockerがディスクスペースを割り当てて使い続けるという問題に遭遇しました。私が誤ってこの問題を起こした最新の方法はRHEL 7.1の "docker"の代わりに "docker-engine" centos buildを使ったことです。起こるように思われることは時々容器の一掃が首尾よく完了しないで、そして次にスペースが決して再利用されないということです。私が/として割り当てた80GBのドライブが/ var/lib/dockerファイルでいっぱいになったとき、私はこの問題を解決するための独創的な方法を考え出す必要がありました。
これが私が思いついたものです。最初にディスクフルエラーを解決します。
この時点で、私はディスクフルエラーはもうありませんでしたが、それでも膨大なスペースを無駄にしていました。次のステップはそれを大事にすることです。
Dockerを起動します。systemctl start docker
すべての画像を保存します。 docker save $(docker画像| sed -e '/ ^/d' -e '/ ^リポジトリ/ d' -e '、[] [] 、:、 '-e'、、[] , ')> /root/docker.img
Dockerをアンインストールします。
/var/lib/docker:rm -rf/var/lib/docker/[cdintv] *内のすべてを消去します。
Dockerを再インストールします
Dockerを有効にする:systemctl dockerを有効にする
開始ドッカー:systemctl開始ドッカー
画像を復元する: docker load </root/docker.img
実行する必要がある永続的なコンテナを起動します。
これにより、ディスク使用量がdockerの67 GBからdockerの6 GBに減少しました。
私はこれを毎日の使用にはお勧めしません。しかし、dockerがソフトウェアエラーや予期しない再起動のためにディスクの空き容量を見失ったようなときに実行すると便利です。
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)
スズメプラグインがあります docker-remove-dangling-images 停止したコンテナや未使用の(未使用の)画像を整理するのに使用できます。
$ sparrow plg run docker-remove-dangling-images
LinuxとWindows OSの両方で動作します。
まず、docker images
を実行して画像のリストを表示し、IMAGE HASH IDをクリップボードにコピーします。
docker rmi -f <Image>
を実行します
オプション-f
は強制削除であることを忘れないでください。