CoreOSとAWSのECSを介してdockerを実行しています。失敗したイメージが何度も再起動しましたが、コンテナーはまだ存在し、ドライブパーティションがいっぱいになりました。具体的には、/var/lib/docker/overlay/
には多数のファイル/ディレクトリが含まれています。
docker-cleanup-volumes が問題であることは知っていますが、/ overlayディレクトリではなく、/ volumesディレクトリをクリーンアップします。
docker ps -a
は、悪いDockerコンテナで250を超える開始試行を示しています。ただし、実行されていません。
rm -rf /var/lib/docker/overlay/*
以外に、どうすればこれをクリーンアップできますか?
私たちの側から:
Sudo docker system Prune -a -f
3Goを救ってくれます!
有名なコマンドも使用します:
Sudo docker rm -v $(Sudo docker ps -a -q -f status=exited)
Sudo docker rmi -f $(Sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm
これをcronに配置して、ディスクスペースをもう少し効率的に管理します。
乾杯
参照: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4
これが今私がやっているハックな方法です。より良い方法があることを望んでいるので、私はそれを答えとして受け入れるつもりはありません。
# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
ignore_errors: true
# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
私はこれを開発環境のbashrcに追加し、毎日実行することに慣れました。
function cleanup_docker() {
docker ps -f status=exited -q | xargs -r docker rm
docker images -f dangling=true -q | xargs -r docker rmi
}
場合によっては、次のスクリプトはすべてのイメージを削除しようとするため、より多くのスペースを解放できますが、単に失敗します。
function cleanup_docker_aggressive() {
for i in $(docker images --no-trunc -q | sort -u)
do
docker rmi $i 2> /dev/null
done
}
悲しいことに、彼らはあなたのソリューションよりもかなりきれいではありません。
編集:Docker 1.13以降では、 docker system を使用できます。
docker system df # to check what is using space
docker system Prune # cleans up also networks, build cache, etc
編集:Docker 2017.09以降、 container および image を使用することもできます
docker container Prune
docker image Prune -a
後者は、--filter "until=24h"
のような派手なフィルターで使用できます
私たちはこの問題を抱え始めたばかりであり、btafareloの答えは私に道の一部を与えてくれました。
システム情報:ELBの背後でCoreOS 1.12を実行しているec2インスタンス
シャットダウンドッカー
systemctl stop docker
rm -rf /var/lib/docker/overlay/*
コマンドの結果を実行する
for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
再起動(すべてを復旧する最も簡単な方法)
これにより、サービスが再起動された後、悪影響なしでディスクの約25%が回復しました。
ドッカーps
- 静か
- すべて
--filter status = exited
ドッカーrm
ドッカー画像
ドッカーrmi
あなたのハックな方法は問題ありません。
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
私のハッキーな方法は
docker rm $(docker ps --all | awk '/ago/{print $1}')
少しきれいな方法は、docker ps
(-q)フラグを付けて--quiet
を実行してID番号のみを取得し、--filter status=exited
を終了したものだけをフィルターすることです。
docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
または、docker rm
(-f)フラグを使用して--force
を実行し、docker ps
(-a)フラグを使用して--all
を実行して、実行中のものもシャットダウンする
docker rm --force $(docker ps --all --quiet) # remove all docker processes
おそらく、いくつかのビルドが失敗した後、そのディスク容量をすべて占有しているのはイメージです。 Dockerホストのディスク容量を節約するには、使用していないDockerイメージを定期的に削除します
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
または、より積極的にするには、--force
(-f)をクリーンアップして--all
(-a)イメージをクリーンアップします。
docker rmi --force $(docker images --all --quiet) # clean all possible docker images
@analytikの 。bashrc 関数に入れる方法は実用的なアイデアのようです
function cleanup_docker() {
docker rm --force $(docker ps --all --quiet) # remove all docker processes
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}
不要なドッカー画像を大量に生成する習慣がある場合は、それを 。bash_logout に追加します
Dockerガベージコレクションは、別のdockerコンテナを使用して簡単に行うことができます https://github.com/spotify/docker-gc
https://github.com/flaccid/docker-docker-gc-crond を使用して、cronとして実行することができます。
注意してください、このソリューションは他の重要なものを削除するようです。
画像/コンテナを検査し、検査の実行で見つからなかった/ opt/docker/overlay内のフォルダーを削除する必要があります
docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt
Sudo ls -l /var/lib/docker/overlay > overlays.txt
diff -u inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs Sudo rm -rf /opt/docker/overlay/
これは https://lebkowski.name/docker-volumes/ からdocker overlayディレクトリを削除するための解決策です
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v
docker <1.9の場合:
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')
またはDocker> = 1.9の場合:
docker volume ls -qf dangling=true | xargs -r docker volume rm