停止しているコンテナのイメージを削除する

背景

dockerイメージを整理しようと思い、docker imagesコマンドを実行したら相当な数のイメージが表示されました。

REPOSITORYとTAGの両方が<none>になっているイメージが多々あったので削除しようと思います。

イメージの削除

ではイメージの削除を行います。docker rmiコマンドを使います。

1
2
$ docker rmi d0df5002f11a
Error response from daemon: conflict: unable to delete d0df5002f11a (must be forced) - image is being used by stopped container ed33132b39b4

エラーが返ってきてしまいました。メッセージを見ると、消そうとしたイメージは止まっているコンテナ(コンテナID ed33132b39b4)で利用されているということです。

コンテナの状況確認

コンテナの状況を確認します。止まっているコンテナも表示したいので、docker ps -aを実行します。

1
2
3
4
5
6
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbe9ff0a5ec5 my-ruby-app "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago relaxed_herschel
0af5cf244837 my-ruby-app "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago peaceful_carson
8216a78943ca d0df5002f11a "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago nervous_mclean
ed33132b39b4 d0df5002f11a "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago hungry_kepler

こちらの記事で利用していたコンテナが止まった状態で残ってしまっているようです。実行時に--rmオプションをつけ忘れたのでしょうか。

ではこれらのコンテナを削除します。

コンテナの削除

コンテナの削除にはdocker rmコマンドを利用します。コンテナIDを指定して実行します。

1
2
$ docker rm ed33132b39b4
ed33132b39b4

確認します。

1
2
3
4
5
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbe9ff0a5ec5 my-ruby-app "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago relaxed_herschel
0af5cf244837 my-ruby-app "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago peaceful_carson
8216a78943ca d0df5002f11a "bundle exec ruby ./…" 4 days ago Exited (0) 4 days ago nervous_mclean

削除できているので、もう一度イメージの削除を行います。

1
2
$ docker rmi d0df5002f11a
Error response from daemon: conflict: unable to delete d0df5002f11a (must be forced) - image is being used by stopped container 8216a78943ca

別のコンテナも利用しているようです…このコンテナも削除します。

1
2
$ docker rm 8216a78943ca
8216a78943ca

イメージを削除します。

1
2
$ docker rmi d0df5002f11a
Deleted: sha256:d0df5002f11a7a3ae48c2567ae218af364facdb8916f93589fc39576815d045d

無事削除できました。

まとめ

イメージを削除できない原因は止まっているコンテナが利用しているイメージだったからでした。

docker run実行時のオプションに--rmを指定しておけば、コンテナ終了時に自動的にコンテナも削除されるので、まずはこのオプションを指定しておくのが良さそうです。

オプションを指定し忘れた場合はdocker rmコマンドで終了させます。そうすればイメージも削除できるはずです。

次回はREPOSITORYやTAGが<none>になってしまうのはなぜなのかを調べてみたいと思います。

参考図書