状況
検証サーバのディスクが残り 2% になった。同僚が「これで一気に空く」と次のコマンドを提案した。DB の mysql コンテナは昨夜の作業で -v を付けずに起動し、今は停止している。
実行前に止めるべき理由として正しいものは?
$ docker system prune -a --volumes -f正答
- -a で実行中のコンテナのイメージまで消え、動いているサービスが止まる
- 停止中の mysql コンテナが消え、データが入った匿名ボリュームも消える
- --volumes で、実行中のコンテナが使う名前付きボリュームまで消える
- ビルドキャッシュが消えるので、次からイメージのビルドが失敗する
解説
docker system prune は停止中のコンテナ、未使用のネットワーク、ダングリングイメージ(-a なら使われていないイメージすべて)、ビルドキャッシュを消す。--volumes を付けると、どのコンテナにも使われていない匿名ボリュームも消える(名前付きボリュームは消さない)。mysql のイメージはデータ置き場をボリュームとして宣言しているので、-v なしで起動するとデータは匿名ボリュームに入る。停止中のコンテナが prune で削除されるとそのボリュームも未使用になり、DB のデータごと消える。-f で確認も出ない。実行中のコンテナが使うイメージやボリュームは消えず、名前付きボリュームはそもそも対象外(1・3 番目は誤り)。ビルドキャッシュが消えても次のビルドが遅くなるだけ。
参考: docs.docker.com
この問題を含む Docker のテストを制限時間つきで解く
Dockerクイズへ