Docker4 択難易度 応用

状況

検証サーバのディスクが残り 2% になった。同僚が「これで一気に空く」と次のコマンドを提案した。DB の mysql コンテナは昨夜の作業で -v を付けずに起動し、今は停止している。

実行前に止めるべき理由として正しいものは?

$ docker system prune -a --volumes -f

正答

  1. -a で実行中のコンテナのイメージまで消え、動いているサービスが止まる
  2. 停止中の mysql コンテナが消え、データが入った匿名ボリュームも消える
  3. --volumes で、実行中のコンテナが使う名前付きボリュームまで消える
  4. ビルドキャッシュが消えるので、次からイメージのビルドが失敗する

解説

docker system prune は停止中のコンテナ、未使用のネットワーク、ダングリングイメージ(-a なら使われていないイメージすべて)、ビルドキャッシュを消す。--volumes を付けると、どのコンテナにも使われていない匿名ボリュームも消える(名前付きボリュームは消さない)。mysql のイメージはデータ置き場をボリュームとして宣言しているので、-v なしで起動するとデータは匿名ボリュームに入る。停止中のコンテナが prune で削除されるとそのボリュームも未使用になり、DB のデータごと消える。-f で確認も出ない。実行中のコンテナが使うイメージやボリュームは消えず、名前付きボリュームはそもそも対象外(1・3 番目は誤り)。ビルドキャッシュが消えても次のビルドが遅くなるだけ。

参考: docs.docker.com

prunevolumedata-loss

この問題を含む Docker のテストを制限時間つきで解く

Dockerクイズへ