キャッシュが無効になった後にキャッシュされた/中間のDockerイメージを削除するにはどうすればいいですか? 質問する

キャッシュが無効になった後にキャッシュされた/中間のDockerイメージを削除するにはどうすればいいですか? 質問する

パイプラインが実行されるたびにアプリ用の Docker イメージを構築する CI パイプラインがあります (パイプラインは、git リポジトリへのコード プッシュによってトリガーされます)。

Docker イメージは、徐々にサイズが非常に大きくなる複数の中間レイヤーで構成されています。中間イメージのほとんどは実行ごとに同一であるため、Docker のキャッシュ メカニズムが大いに活用されます。

しかし、問題は、ビルドされたアプリケーション成果物がイメージにコピーされる dockerfile 内の COPY ステートメントの結果として、最後の 2 つのレイヤーが実行ごとに異なることです。成果物は実行ごとに変更されるため、すでにキャッシュされている最下部のイメージは常に無効になります。これらのイメージのサイズはそれぞれ 800 MB です。

新しいイメージに置き換えられた、つまり無効になったイメージを識別 (および削除) するには、どの docker コマンドを使用できますか?

CI パイプラインで実行の最後にそれらを削除して、CI サーバー上に残って大量のディスク領域を無駄にしないようにしたいと思います。

ベストアンサー1

私の理解が正しければ、コードをプッシュするたびに、CI パイプラインは新しいイメージを作成し、そこにアプリケーションの新しいバージョンがデプロイされます。その結果、以前に作成されたイメージは古くなるため、削除する必要があります。そのためには、次の手順を実行する必要があります。

  1. 古いイメージから作成された古いコンテナをすべて削除します
  • コマンドですべてのコンテナを表示するdocker ps -a
  • まだ実行中の場合は、コマンドで古いコンテナを停止します。docker stop [containerID]
  • それらを削除するcommand docker rm [containerID]
  1. 次のコマンドで古い画像を削除します:docker rmi [imageID]

このプロセスが必要な理由をまとめると、既存のコンテナによって使用されるまで、イメージを削除することはできません (停止したコンテナでもイメージは必要です)。このため、最初に古いコンテナを停止して削除し、次に古いイメージを削除する必要があります。

検出部分と削除プロセスの自動化は、CI パイプラインが新しいイメージを作成するときに生成するイメージ バージョンとコンテナー名に基づく必要があります。

編集1

タグ付けされた画像と関係のないすべての画像を一覧表示するには、コマンド を使用しますdocker images -f dangling=true。それらの画像を削除するには、コマンド を使用しますdocker images purge

ここで覚えておいていただきたいことが 1 つあります。イメージをタグ付けせずにビルドすると、そのイメージは「ぶら下がっている」イメージのリストに表示されます。ビルド時にタグを指定すると、この状況を回避できます。

編集2

イメージを消去するためのコマンドが変更されました。現在、適切なコマンドは次のとおりです。

docker image prune

がここにありますリンクドキュメント付き

おすすめ記事