このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Docker超入門:ONBUILD実践➁:base-imageとwhale-imageの構築手順

ONBUILD実践②:base-imageとwhale-imageの構築手順
前回の「ONBUILD実践①:base-imageとwhale-imageの構築手順」では、Dockerfile.base と Dockerfile を作成し、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
ff60df9a582721fb423bd82e5c18be64d7cdea03c172acfb51383a0c349069b3Webブラウザでの確認
ブラウザを開いて、アドレスバーに 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コンテンツが自動的に反映される流れを解説していきます。
