dockerのcontainerとimageを一括削除する方法「spotify/docker-gc」
Dockerのコンテナをぽいぽい上げ下げしていると、どんどんイメージが溜まってディスク容量を圧迫してしまうというのはよくある話です。
dockerには運用管理者向けのコマンドとして prune
というものが用意されているのですが、結構制限が強いコマンドなので、かゆいところに手が届かない時もしばしばあります。
# コンテナのお掃除
# Dockerが自動で判断して、停止中のコンテナを吹き飛ばす
docker container prune
# イメージのお掃除
# Dockerが自動で判断して、起動中のコンテナと紐づいていないイメージを吹き飛ばす
docker image prune
# イメージ、ボリューム、ネットワークなど、全てお掃除
docker system prune
この問題を解決するスマートな方法がありましたのでまとめます。
spotify/docker-gc
SpotifyのナイスガイがDockerのガベージコレクション(ゴミ拾い)をするスクリプトを GitHub にあげています。
1時間以上前に終了したコンテナと、起動中のコンテナに属していないイメージを削除してくれます。
使い方は簡単で、下記コマンドを打つだけです。
コンテナのお掃除
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
イメージのお掃除
イメージを削除する場合は REMOVE_VOLUMES=1 という環境変数を指定します。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc -e REMOVE_VOLUMES=1 spotify/docker-gc
Dry run
いきなり試すのが怖い場合は次のように環境変数を指定することでDry run(テスト)が可能です。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc -e DRY_RUN=1 spotify/docker-gc
お掃除対象の微修正
デフォルトだと停止してから1h以上経っていないコンテナは削除対象になりませんが、 GRACE_PERIOD_SECONDS 変数に好きな値を指定することで調整可能です。
次の場合は停止してから86400(24h)以上経過したコンテナが削除対象になります。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc -e GRACE_PERIOD_SECONDS=86400 spotify/docker-gc
強制削除
Dockerはコンテナ削除の際に問題が発生した場合、エラーを返して終了しますが、強制的に削除することも可能です。
FORCE_CONTAINER_REMOVAL=1
また、複数のリポジトリにタグづけされたイメージも削除しないようになっていますが、次の環境変数を指定することで強制削除できます。
FORCE_IMAGE_REMOVAL=1
まとめ
Dockerのガベージコレクションを簡単に実行できるspotify/docker-gcの使い方をまとめました。Cronに仕込むなりして自動化すれば、ルンバのごとくお掃除してくれてます(危険なので良い子のみんなは真似しちゃダメだぞ!)やったぜ!