【Docker】Dockerfileのビルドに伴って生成される<none>:<none>イメージを削除する

Dockerはアプリケーションをコンテナとして提供するソフトウェアです。コンテナの基となるDockerイメージを構築するために記述されるファイルはDockerfileと呼ばれます。本記事では、DockerfileからDockerイメージをビルドする際に生じるdanglingイメージとその削除について解説します。

Danglingイメージ

<none>:<none>とタグ付けされるDockerイメージは大別して2種類存在します。ひとつは、以下のように-aオプションを指定しない限り表示されないイメージです。これはintermediateイメージと呼ばれ、他のイメージと親子関係を持っている正常なイメージであり、通常対処は必要ありません。本記事では、-aオプションを指定しない場合に表示される<none>:<none>について扱います。こちらはdanglingイメージと呼ばれ、本来あった他イメージとの親子関係がbuildやpullに伴い崩れた際に発生します。

$ #すべてのイメージを表示する
$ docker image ls -a
$ #intermediateイメージは表示しない
$ docker image ls

Danglingイメージが発生する例

説明にあたり、helloという名前のイメージとworldという名前のイメージの2つを考えます。helloとworldはそれぞれ以下に示すDockerfileで構築されます。

# hello
FROM ubuntu:bionic

RUN echo Hello > hello.txt
# world
FROM hello

RUN echo ", World!" >> hello.txt

helloのほうは、”Hello”と書き込まれたhello.txtのあるイメージを構築する単純なDockerfileです。worldではさらに”, World!”と書き込んであるイメージが構築されます。これらをそれぞれ以下のようにビルドします。helloのDockerfileはhelloというフォルダに、worldのDockerfileはworldというフォルダに保存されているものとします。

$ docker build -t hello hello/
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM ubuntu:bionic
 ---> cf0f3ca922e0
Step 2/2 : RUN echo Hello > hello.txt
 ---> Running in 6ac8068c2c30
Removing intermediate container 6ac8068c2c30
 ---> 2a9025072e28
Successfully built 2a9025072e28
Successfully tagged hello:latest
$
$ docker build -t world world/
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM hello
 ---> 2a9025072e28
Step 2/2 : RUN echo ", World!" >> hello.txt
 ---> Running in ce456d030690
Removing intermediate container ce456d030690
 ---> 00b32d2a2d9c
Successfully built 00b32d2a2d9c
Successfully tagged world:latest
$
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
world               latest              00b32d2a2d9c        1 second ago        64.2MB
hello               latest              2a9025072e28        21 seconds ago      64.2MB
ubuntu              bionic              cf0f3ca922e0        2 weeks ago          64.2MB
$
$ docker run -it world bash
$ cat hello.txt
Hello
, World!

worldを起動してhello.txtを見てみると、2行に渡り”Hello, World!”と書き込まれているのが確認できます。ここで、”Hello, World!”が1行に書き込まれるように、helloのDockerfileを手直ししてみます。以下のように修正したhelloのDockerfileを使い、改めてhelloとworldをビルドし直します。

# hello v2
FROM ubuntu:bionic

RUN echo -n Hello > hello.txt
$ docker build -t hello hello/
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM ubuntu:bionic
 ---> cf0f3ca922e0
Step 2/2 : RUN echo -n Hello > hello.txt
 ---> Running in bb1ce295f96d
Removing intermediate container bb1ce295f96d
 ---> 0d92fccb9675
Successfully built 0d92fccb9675
Successfully tagged hello:latest
$
$ docker build -t world world/
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM hello
 ---> 0d92fccb9675
Step 2/2 : RUN echo ", World!" >> hello.txt
 ---> Running in ff7f16ac419a
Removing intermediate container ff7f16ac419a
 ---> 7444c2a29b9d
Successfully built 7444c2a29b9d
Successfully tagged world:latest
$
$ docker run -it world bash
$ cat hello.txt
Hello, World!
$
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
world               latest              7444c2a29b9d        2 seconds ago        64.2MB
hello               latest              0d92fccb9675        13 seconds ago       64.2MB
<none>              <none>              00b32d2a2d9c        About a minute ago   64.2MB
ubuntu              bionic              cf0f3ca922e0        2 weeks ago          64.2MB

再ビルドの結果、”Hello, World!”が1行で出力されるようになりましたが、danglingイメージが発生しました。当該イメージのIMAGE IDである00b32d2a2d9cから、先のビルドで作成されたworldがdanglingイメージになったことが確認できます。これは再ビルドにより以前のhelloが上書きされて消え、この新しいhelloと親子関係をもつ新しいworldができたことに起因します。前のworldはタグを外され宙ぶらりんになってしまいました。

Danglingイメージの削除

Danglingイメージは以下のコマンドで削除が可能です。

$ docker system prune

参考リンク

Share - この記事をシェアする