この質問は、https://stackoverflow.com/questions/17014263/should-i-be-concerned-about-excess-non-running-docker-containers に関連しています。
古いコンテナを削除する方法について悩んでいます。docker rm 3e552code34aでは1つのコンテナを削除できますが、すでにたくさんあります。docker rm --help
では、選択オプション(allとか、イメージ名でとか)が出てきません。
もしかしたら、これらのコンテナが保存されているディレクトリがあって、そこから手動で簡単に削除できるのでしょうか?
Docker 1.13.x]1以降は、Docker container pruneが使用できます。
docker container prune
これにより、停止しているすべてのコンテナが削除され、すべてのプラットフォームで同じように動作するはずです。
また、Docker system pruneというものもあります。
docker system prune
これは、使用されていないすべてのコンテナ、ネットワーク、イメージ(ぶら下がっているものと参照されていないものの両方)、そしてオプションでボリュームを、1つのコマンドでクリーンアップします。
古いDockerバージョンでは、Dockerコマンドと他のUnixコマンドを組み合わせて、必要なものを得ることができます。ここでは、数週間前の古いコンテナをクリーンアップする方法の例を紹介します。
$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm
この例は https://twitter.com/jpetazzo/status/347431091415703552 から引用しています。
もう一つの方法は、Guillaume J. Charmes氏から教えてもらったものです(クレジットはこちら)。
docker rm `docker ps --no-trunc -aq`
は、エレガントな方法ですべてのコンテナを削除します。
Bartosz Bilicki氏によるWindows用のものです。
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
PowerShell用です。
docker rm @(docker ps -aq)
Docker 1.13 (Q4 2016)でのアップデート、クレジットはVonC(このスレッドの後半)です。
docker system prune
では、使用されていないデータがすべて削除されます(つまり、停止しているコンテナ、コンテナのないボリューム、コンテナのないイメージの順に削除されます)。
PR 26108][3]およびcommit 86de7c0を参照してください。これらのコマンドは、Dockerデーモンのデータがディスク上でどのくらいの容量を占めているかを簡単に視覚化し、「不要な」余分なものを簡単にクリーンアップできるようにするために、いくつかの新しいコマンドを導入しています。
docker system prune
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
まず、コンテナを削除する前に、実行中のコンテナを停止します。
docker rm $(docker stop -t=1 $(docker ps -q))
stopではなく、
killを使うこともできます。私の場合は
stop` を使います。なぜなら、毎回新しいコンテナを作るのではなく、再実行することが多いので、きれいにシャットダウンするようにしているからです。
注意:コンテナを停止しようとすると、エラーが発生します。
Error:Impossible to remove a running container, please stop it first
docker rm $(docker ps -a -q)