CUBE SUGAR CONTAINER

技術系のこと書きます。

動作中の Docker コンテナからイメージを作る

Docker コンテナを使って技術検証をしているときに、色々と試行錯誤している場面では、ある手順から作業をやり直したくなることがある。 すべての作業がすぐに終わるなら特に問題にはならないものの、時間がかかる場合には初めからやり直したときに大きなロスが生じる。 そんなときは、動作中の Docker コンテナから Docker イメージを作ることで時間の節約ができる。 具体的には docker commit サブコマンドを使うことで実現できる。

今回、使った環境は次のとおり。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15
$ docker version                     
Client: Docker Engine - Community
 Cloud integration: 1.0.2
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 16:58:31 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:07:04 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

もくじ

作業中を模した Docker コンテナを用意する

とりあえず、何でも構わないのでコンテナを立ち上げておく。

$ docker container run \
  --rm \
  -it ubuntu:18.04 \
  bash

立ち上げた以下のコンテナを、何らかの検証で作業中のコンテナに見立てる。

root@f499b0f5b72b:/#

たとえば、次のようにファイルを書き出しておこう。 このファイルがあることで、作業が途中まで完了していることの目印とする。

root@f499b0f5b72b:/# echo "Hello, World" > /var/tmp/greet.txt

動作中のコンテナからイメージを作る

Docker ホスト側で、お目当てのコンテナが動作していることを確認する。 別にコンテナが終了していても構わないんだけど、今回は --rm オプションをつけているのでコンテナは終了すると消えてしまう。

$ docker container ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f499b0f5b72b        ubuntu:18.04        "bash"              31 seconds ago      Up 29 seconds                           eloquent_keller

それでは、docker commit コマンドを使って、コンテナからイメージを作ろう。 最初の引数にお目当てとなるコンテナの ID ないし名前を指定して、次の引数にコンテナを元ネタにしたイメージの名前を指定する。

$ docker commit f499b0f5b72b example
sha256:0bbb09b0e9a30bfd0ba7a342eddb7bbcc6380b0542a1379c7c8e54587e24392a

イメージの一覧を確認すると、ちゃんと指定した名前でイメージができている。

$ docker image list | grep example
example                              latest                                           0bbb09b0e9a3        14 seconds ago      64.2MB

作ったイメージからコンテナを起動する

上記のイメージを使ってコンテナを立ち上げてみよう。

$ docker container run \
  --rm \
  -it example \
  bash

イメージの元ネタになったコンテナにあったはずのファイルを確認すると、次のようにちゃんとある。 つまり、作業の途中からやり直すことができている。

root@a05ba64a868b:/# cat /var/tmp/greet.txt 
Hello, World

めでたしめでたし。

参考

docs.docker.com