(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker】変更を加えたコンテナをイメージとして別名保存する

スポンサーリンク

はじめに

Dockerの世界にて「イメージは読み取り専用のコンテナテンプレート」ですが、
例えば以下のように元のイメージをベースに修正を加えたものを新たなテンプレートとしたいケースがあります。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              d131e0fa2585        5 days ago          102 MB

本記事ではその流れを簡単に説明します。

コマンド実行環境
ホスト環境 Red Hat Enterprise Linux Server 7.6

変更を加えたコンテナから作成

例えばubuntuイメージからコンテナ作成を行い、そのコンテナ内でルートディレクトリにhogeファイルを作成したとします。

以下がそのコンテナです。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a0b8fce71874        ubuntu              "/bin/bash"         2 days ago          Exited (0) 52 seconds ago                       friendly_dijkstra

コンテナを別イメージとして保存するコマンドはdocker container commitとなります。

Usage: docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith ")
-c, --change list Apply Dockerfile instruction to the created image (default [])
-m, --message string Commit message
-p, --pause Pause container during commit (default true)

必須な引数は変更を加えたコンテナIDです。
ちなみにイメージ名(リポジトリ名)を引数として与えずに実行すると名称が none になります。

今回は新たなイメージ名をubuntu-hogeとして実行しました。

# docker container commit a0b8fce71874 ubuntu-hoge
sha256:0c73ea9ac03407439ccc7f191b8a81a0aaa229085ec03284b0380f8.......

コンテナは変化していませんが

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a0b8fce71874        ubuntu              "/bin/bash"         2 days ago          Exited (0) 6 minutes ago                       friendly_dijkstra

イメージは追加されています。別名保存できました

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-hoge   latest              0c73ea9ac034        38 seconds ago      127 MB
docker.io/ubuntu    latest              d131e0fa2585        5 days ago          102 MB

念のため起動/ログインして確認しますが確かに必要な変更(hogeの存在)が確認できます。

# docker run -t -i ubuntu-hoge
root@4a5afdb266af:/# ls
bin  boot  dev  etc  hoge  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


また、変更を加えたコンテナを元にするわけではないですが、変更する手順が整備されている場合は以下のようなことも可能です。

Dockerfileからイメージを作成

以下のようなDockerfileと名付けた設定ファイルを用意します。

# cat Dockerfile 
FROM ubuntu
RUN touch hogehogee

これは文字通り ubuntuというイメージからtouch hogehogeというコマンドを実行したイメージを用意することを指します。

このファイルが配置されたディレクトリ上でbuildコマンドを実行します。イメージ名を引数にとります。

# docker build -t ubuntu-hogehoge .
Sending build context to Docker daemon 6.293 MB
Step 1/2 : FROM ubuntu
 ---> d131e0fa2585
Step 2/2 : RUN touch hogehogee
 ---> Running in 60a31707863a
 ---> 48e79c2a6ffc
Removing intermediate container 60a31707863a
Successfully built 48e79c2a6ffc

以下のようにイメージが作成されていることが分かります。別名保存できました

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-hogehoge     latest              48e79c2a6ffc        16 seconds ago      102 MB
ubuntu-hoge   latest              0c73ea9ac034        2 hours ago         102MB
docker.io/ubuntu    latest              d131e0fa2585        5 days ago          102 MB

念のため起動/ログインして確認しますが確かに必要な変更(hogehogeの存在)が確認できます。

# docker run -t -i ubuntu-hogehoge
root@b34edd0ff03d:/# ls
bin  boot  dev  etc  hogehogee  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

終わりに

イメージを作成する二つのパターンについて解説を行いました。

説明は最小の記載に留めましたが例えば「docker build --help」とコマンドを押下すれば数多くのオプションが確認できたりと、かなり奥が深い内容です。

それらを理解するとっかかりに、本記事がなれば幸いです。