このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Docker超入門:ONBUILD実践➁:base-imageとwhale-imageの構築手順

ONBUILD実践②:base-imageとwhale-imageの構築手順

 前回の「ONBUILD実践①:base-imageとwhale-imageの構築手順」では、Dockerfile.baseDockerfile を作成し、ONBUILD命令を仕込んだ base-image と、それを利用する whale-image の準備をしました。ここでは実際に base-image をビルドし、コンテナを動かして ONBUILD の動作を確認していきます。

ここで行うことの確認

 「ONBUILD実践➁:base-imageとwhale-imageの構築手順」では、下図のオレンジ枠の操作を行っていきます。

Dockerfile.base の確認

Dockerfile.base の中には、次のような命令がありました。

ONBUILD ADD webcontent.tar /var/www/html

この命令は webcontent.tar を /var/www/html にコピーする ものです。
 ただし注意点として、この ONBUILD 命令は base-image をビルドした時点では実行されず、後にこのイメージを使って別のイメージをビルドしたときに発動します。

1回目のビルド(base-image の作成)

まずは base-image をビルドします。

docker build -t base-image -f Dockerfile.base .
オプション説明
-t作成するイメージに名前(タグ)をつける。ここでは base-image
-f使用するDockerfileを指定。ここでは Dockerfile.base
.カレントディレクトリをビルドコンテキストとして指定

 このコマンドを実行すると、Ubuntu イメージをベースに Nginx がインストールされ、base-image という名前で保存されます。出力の最後に unpacking to docker.io/library/base-image:latest と表示されれば成功です。

出力例

PS C:\Users\joeac\Desktop\docker\Webserver2> docker build -t base-image -f Dockerfile.base .
[+] Building 137.0s (7/7) FINISHED                   docker:desktop-linux
 => [internal] load build definition from Dockerfile.base            0.2s

(省略)

 => => transferring context: 2B                                      0.0s
 => [1/2] FROM docker.io/library/ubuntu:latest@sha256:353675e2a41ba  2.3s
 => => resolve docker.io/library/ubuntu:latest@sha256:353675e2a41ba  0.1s
 => => sha256:953cdd4133718b72c5d0a78e754c1405c02 29.72MB / 29.72MB  1.3s
 => => extracting sha256:953cdd4133718b72c5d0a78e754c1405c02510fdb5  0.6s
 => [2/2] RUN apt-get update && apt-get install -y -q nginx        128.5s
 => exporting to image                                               2.6s

(省略)

 => => unpacking to docker.io/library/base-image:latest              0.4s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/3lu5ft65iimyv305mvx0o4vb3

コンテナの作成と実行

作成した base-image をもとにコンテナを立ち上げてみましょう。

docker run --name base-container -it -d -p 80:80 base-image
オプション説明
--name base-containerコンテナの名前を base-container に設定
-it対話モード + 擬似TTYを付与(ログ確認などに便利)
-dバックグラウンドで実行
-p 80:80ホストの80番ポートをコンテナの80番に接続

このコマンドで base-container が作成され、Nginx が起動します。

出力例

PS C:\Users\joeac\Desktop\docker\Webserver2> docker run --name base-container -it -d -p 80:80 base-image
ff60df9a582721fb423bd82e5c18be64d7cdea03c172acfb51383a0c349069b3

Webブラウザでの確認

ブラウザを開いて、アドレスバーに http://localhost と入力します。
 Nginx のデフォルトページが表示されますが、ONBUILD で仕込んだ webcontent.tar の内容は表示されません。※webcontent.tarは現時点では作成していません。

 これは、1回目のビルドでは ONBUILD が発動しない ことを意味しています。ONBUILD の処理は、このイメージをベースに新しいイメージを作る「2回目のビルド」で実行されます。

イラストで理解する ONBUILD の流れ

ONBUILD の仕組みを図にするとさらにわかりやすいです。

まとめ

ここまでで、ONBUILD 命令が 1回目のビルドでは実行されない ことを確認できました。
 実際に base-container を起動しても、Webコンテンツは反映されず、Nginx のデフォルトページが表示されるだけです。

 次回の「ONBUILD実践➂:base-imageとwhale-imageの構築手順」では、whale-image をビルドして ONBUILD が発動し、Webコンテンツが自動的に反映される流れを解説していきます。