web-dev-qa-db-ja.com

未使用のDockerイメージとコンテナを自動的に削除する方法は?

ガベージコレクションを自動的に実行し、ぶら下がっているすべての画像とコンテナを削除するようにdocker swarmに指示する方法はありますか?走る docker stack rm STACK_NAMEスタックを再デプロイしますが、これにより未使用のオブジェクトが保持されます。 docker Prune を実行してクリーニングを実行できることはわかっていますが、dockerに自動的に実行するように指示する方法はありますか?

P.Sこれに従って履歴保持制限を設定してみました post

6
tkyass

Pruneはあなたが得る最高のものであり、Swarmの内部ではまだそれを行わないため、他の方法ですべてのノードで自動化する必要があります。 ただし、サービス、およびBashワンライナーとグローバルモードを使用すると、簡単に修正できます:

90%の場合、スペースを占有しているのは古いイメージです。Swarmを使用しているため、Swarmサービスの外部でホスト上で何かを実行したくないので、サービスで単純なワンライナーを実行してみましょう。これにより、すべてのノードで1日1回画像が削除されます。

docker service create --name Prune-images --mode global --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock docker sh -c "while true; do docker image Prune -af; sleep 86400; done"

コンテナを手動で削除するのではなく、タスク履歴制限を使用してそれを制御することに注意してください。古いタスクをそのままにしておきます(これにより、終了コード/エラーがないか検査し、ログを表示できます)。デフォルトはサービスごとに5であるため、クラスター内のすべてのSwarmサービスでこれを2に変更する場合は、次のようにします。

docker swarm update --task-history-limit=2

その後、古いコンテナはより早くクリーンアップされ、それらによって使用されていた古いイメージはPruneによってキャッチされます。履歴には実行中のコンテナが含まれるため、制限が2の場合、単一のシャットダウンコンテナがハングアップすることに注意してください(メタデータとログの検査を含む)。

7
Bret Fisher

正確な答えをくれた@DhiaTNに感謝します。私はいくつかの欠けている点をカバーしています。タグ付けされていないすべての画像を削除するには、

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
4
SushilG

あなたは次のようにします:

docker stop $(docker ps -a) # stop all containers
docker rm $(docker ps -a) -f # delete all containers
docker rmi $(docker images -a -q) # delete all images

詳細について オプション

3
DhiaTN