Docker:【履歴削除】が不要になる方法


はじめに

Dockerの仕様

  • 基本
    • 作成する環境はイメージ(Dockerイメージ)として作成
    • 作成したイメージを使ってコンテナ実行
    • コンテナ実行が終了すると実行履歴に残る
  • イメージとコンテナ
    • イメージがあれば何度でもコンテナ実行できる
    • コンテナと実行に利用したイメージは紐づいている
    • イメージを削除する場合、紐づくコンテナすべての削除が必要

困ること

  • 頻繁にイメージ作成やコンテナ実行を行うと
    • 不要なデータが多くできる
    • 件数が多いと削除が面倒
    • イメージに紐づいたコンテナを見つけることも面倒
  • また、コンフリクト(競合)エラーはストレス
    • コンテナ実行履歴を削除(docker rm)
    • 実行中なら停止(docker stop)も必要
  • このような状況を回避することが本ページのモチベーション
  • 参考
    • コンフリクトエラーの発生時の対処

対処方法(予防策)

  • docker runコマンド実行オプション「–rm」を使う
    (rmの左のハイフンは2つ)
    • コンテナ実行履歴が残らない
    • つまり、イメージ削除時の競合エラーが起きない
  • 以降に具体例で説明

実行ログ

困った状況(競合エラー)を再現

イメージ作成

sudo docker build -t sample-rm -<<+ # ビルド実行
FROM alpine
CMD "sh" "-c" "echo test"
+
sudo docker images # イメージを確認
$ sudo docker build -t sample-rm -<<+ # ビルド実行
> FROM alpine
> CMD "sh" "-c" "echo test"
> +
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM alpine
 ---> c059bfaa849c
Step 2/2 : CMD "sh" "-c" "echo test"
 ---> Running in 5dfcbb976e77
Removing intermediate container 5dfcbb976e77
 ---> 72fac589a22c
Successfully built 72fac589a22c
Successfully tagged sample-rm:latest

$ sudo docker images # イメージを確認
REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE
sample-rm                   latest    72fac589a22c   5 seconds ago   5.59MB
alpine                      latest    c059bfaa849c   2 months ago    5.59MB
hello-world                 latest    feb5d9fea6a5   4 months ago    13.3kB
ubuntu                      12.04     5b117edd0b76   4 years ago     104MB
dockersamples/static-site   latest    f589ccde7957   5 years ago     191MB
  • docker build
    • イメージ作成
    • タグ名は「sample-rm」を指定する
  • docker images
    • イメージ一覧を表示する
    • REPOSITORY列が「sample-rm」のイメージが作成された

コンテナ実行

sudo docker run --name sample-conte sample-rm # コンテナ実行
sudo docker ps -a # コンテナ実行履歴確認
$ sudo docker run --name sample-conte sample-rm # コンテナ実行
test

$ sudo docker ps -a # コンテナ実行履歴確認
CONTAINER ID   IMAGE         COMMAND                     CREATED         STATUS                     PORTS     NAMES
0e8f3a2d7662   sample-rm     "/bin/sh -c '\"sh\" \"-…"   5 seconds ago   Exited (0) 3 seconds ago             sample-conte
be19cc34d51b   hello-world   "/hello"                    4 days ago      Exited (0) 4 days ago                condescending_almeida
13e8f94aab43   hello-world   "/hello"                    4 days ago      Exited (0) 4 days ago                gallant_lumiere
e62a017fdc2d   hello-world   "/hello"                    4 days ago      Exited (0) 4 days ago                magical_euclid
  • docker run
    • コンテナ実行する
    • コンテナ名は「sample-conte」を指定
    • CMDに記載した「test」が表示された
  • docker ps -a
    • コンテナ実行履歴を表示する
    • NAMES列が「sample-conte」のコンテナ実行履歴ができた
    • コンテナID(CONTAINER ID列)は「0e8f3a2d7662」

イメージ削除(削除できない)

sudo docker rmi sample-rm # イメージ削除
$ sudo docker rmi sample-rm # イメージ削除
Error response from daemon: conflict: unable to remove repository reference "sample-rm" (must force) - container 0e8f3a2d7662 is using its referenced image 72fac589a22c
  • docker rmi
    • イメージ名「sample-rm」を削除キーにして削除
  • エラー発生
    • 競合エラー:Error response from daemon: conflict
    • 削除できない:unable to remove repository reference

予防策を実施

イメージ作成

  • 続けて実行する場合はコンテナ実行履歴とイメージ削除
    • sudo docker rm sample-conte
    • sudo docker rmi sample-rm
sudo docker build -t sample-rm -<<+ # ビルド実行
FROM alpine
CMD "sh" "-c" "echo test"
+
sudo docker images # イメージを確認
$ sudo docker build -t sample-rm -<<+ # ビルド実行
> FROM alpine
> CMD "sh" "-c" "echo test"
> +
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM alpine
 ---> c059bfaa849c
Step 2/2 : CMD "sh" "-c" "echo test"
 ---> Running in 12be26839119
Removing intermediate container 12be26839119
 ---> a2bc93c88645
Successfully built a2bc93c88645
Successfully tagged sample-rm:latest

$ sudo docker images # イメージを確認
REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE
sample-rm                   latest    a2bc93c88645   5 seconds ago   5.59MB
alpine                      latest    c059bfaa849c   2 months ago    5.59MB
hello-world                 latest    feb5d9fea6a5   4 months ago    13.3kB
ubuntu                      12.04     5b117edd0b76   4 years ago     104MB
dockersamples/static-site   latest    f589ccde7957   5 years ago     191MB
  • docker build
    • イメージ作成
    • タグ名は「sample-rm」を指定する
  • docker images
    • イメージ一覧を表示する
    • REPOSITORY列が「sample-rm」のイメージが作成された

コンテナ実行

sudo docker run --rm --name sample-conte sample-rm # コンテナ実行
sudo docker ps -a # コンテナ実行履歴確認
$ sudo docker run --rm --name sample-conte sample-rm # コンテナ実行
test

$ sudo docker ps -a # コンテナ実行履歴確認
CONTAINER ID   IMAGE         COMMAND    CREATED      STATUS                  PORTS     NAMES
be19cc34d51b   hello-world   "/hello"   4 days ago   Exited (0) 4 days ago             condescending_almeida
13e8f94aab43   hello-world   "/hello"   4 days ago   Exited (0) 4 days ago             gallant_lumiere
e62a017fdc2d   hello-world   "/hello"   4 days ago   Exited (0) 4 days ago             magical_euclid
  • docker run
    • コンテナ実行する
    • コンテナ名は「sample-conte」を指定
    • 「–rm」オプションを指定する(rmの左のハイフンは2つ)
    • CMDに記載した「test」が表示された
  • docker ps -a
    • コンテナ実行履歴が作成されないことが確認できる

イメージ削除

sudo docker rmi sample-rm # イメージ削除
sudo docker images #イメージ削除確認
$ sudo docker rmi sample-rm # イメージ削除
Untagged: sample-rm:latest
Deleted: sha256:a2bc93c88645017686205a3f9c45cd1aaa941d0fbb0fcf241a62b6b4cc40c0d9

$ sudo docker images #イメージ削除確認
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
alpine                      latest    c059bfaa849c   2 months ago   5.59MB
hello-world                 latest    feb5d9fea6a5   4 months ago   13.3kB
ubuntu                      12.04     5b117edd0b76   4 years ago    104MB
dockersamples/static-site   latest    f589ccde7957   5 years ago    191MB
  • docker rmi
    • イメージ名「sample-rm」を削除キーにして削除
    • 削除された:Deleted
    • 競合エラー発生を回避できた
  • docker images
    • イメージが削除されたことが確認できる

リファレンス


Posted by futa