Docker を長時間実行すると、システム内に多くのイメージが存在します。未使用の Docker イメージをすべて安全に一度に削除して、ストレージを解放するにはどうすればよいですか?
さらに、数か月前に取得した、正しい を持つ画像も削除したいと思いますTAG
。
したがって、タグなしイメージのみの削除を求めているのではありません。タグなしイメージと、数か月前に正しい方法でプルされたイメージの両方を含む、一般的な未使用イメージを削除する方法を探していますTAG
。
ベストアンサー1
(元の回答は下記を参照)
2016 年 9 月更新: Docker 1.13:広報26108そしてコミット 86de7c0Docker デーモンのデータがディスク上で占めるスペースの量を視覚化し、「不要な」余分な部分を簡単にクリーンアップできるようにするための新しいコマンドをいくつか導入しました。
docker system prune
すべての未処理データ (コンテナ、ネットワーク、イメージ) を削除します。 オプションを使用してすべての未使用ボリュームを削除し--volumes
、 オプションを使用してすべての未使用イメージ (未処理のものだけでなく) を削除できます-a
。
また、次のものも持っています:
未使用のイメージの場合は、 (ぶら下がっているイメージや未使用のイメージdocker image prune -a
を削除するため) を使用します。警告: 「unused」は「どのコンテナーからも参照されていないイメージ」を意味します。 を使用する前に注意してください。-a
図に示すようにALの答えは、ぶら下がっている画像だけでなく、使用されていないdocker system prune --all
画像もすべて削除します...これは少しやりすぎかもしれません。
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!=...
見る "画像の整理」を例に挙げます。
--dry-run
警告:これらのコマンドには「プレビュー」または「 」オプションはありませんdocker xxx prune
。
これは、moby/moby
問題 306232017年以来、しかし実装が難しい(2022年8月)
何が剪定されるかについてのより代表的な概要を把握することは、さまざまな理由から非常に複雑になります。
- 競合状態(制限事項を文書化することで解決できます)。
コンテナ/イメージ/ボリューム/ネットワークは、「ドライ ラン」が使用されている時点では使用されていない可能性がありますが、実際のプルーニングが実行された瞬間には使用されている可能性があります (またはその逆)。そのため、ドライ ランは常にプルーニングされる内容の「近似値」になります。- より難しい部分は、オブジェクト (コンテナ、イメージ、ネットワークなど) が相互に依存している方法です。
たとえば、イメージは参照がなくなった場合 (タグがなくなった場合、それを使用しているコンテナがなくなった場合)、削除できます。これが、docker system prune が特定の順序でオブジェクトを削除する理由です (最初に未使用のコンテナをすべて削除し、次に未使用のイメージを削除します)。
「ドライ ラン」で同じフローを再現するには、すべてのオブジェクトの表現と、それに基づいて参照されている場所を一時的に構築する必要があります (基本的には、すべての参照カウンターを複製し、その「シャドウ」表現から参照を削除します)。- 最後に、スナップショット (イメージとレイヤーのストア)の統合作業が進む
containerd
につれて、状況はさらに変化する可能性があります。
たとえば、イメージはマルチアーキテクチャにすることができ、(後で説明しますが)「プルーニング」によって、イメージから未使用のバリアント (アーキテクチャ) を削除してスペースをクリーンアップできるため、「何を削除できるか」の計算に別の次元がもたらされます。
元の回答 (2016 年 9 月)
私は通常次のようにします:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
私は[それらを削除するエイリアスを持っていますぶら下がっている画像: drmi
]13
フィルター
dangling=true
は未使用の画像を見つけます
こうすることで、ラベル付けされた画像によって参照されなくなった中間画像が削除されます。
私もまず同じことをします終了したプロセス(コンテナ)
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
技術的には、イメージをクリーンアップする前にまずコンテナをクリーンアップする必要があります。これにより、より多くの未解決のイメージが検出され、エラーが少なくなります。
ジェス・フレイゼル (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 時間以上前に退出したコンテナは削除されます。
- その後、残りのコンテナに属していないイメージは削除されます。