概要
Dockerfileで記載できるONBUILD命令がいまいちよくわからなかったので実際に動かしてやってみようと思います。
そもそもONBUILDとは
以下Dockerの公式ドキュメントより(Google翻訳)
このONBUILD命令は、イメージが別のビルドのベースとして使用されるときに、後で実行されるトリガ命令をイメージに追加する。トリガは、ダウンストリームのビルドのコンテキストで実行され、あたかもFROMダウンストリームの命令の直後に挿入されたかのように実行されます。
どのビルド命令もトリガとして登録できます。
なるほどわからん
いろいろ調べた結果
ONBUILDを記載したDockerfileでdocker buildする。
↓
イメージができる。
でもこのタイミングではONBUILDに書いた内容はイメージに適用されていない。
↓
さっきつくったイメージをもとにほかのイメージをdocker buildする。
ONBUILDの内容が反映されている!!!
つまり2回めのdocker buildで実行される処理という理解。
実際にやってみる
実際にONBUILDの動きをみてみます。
事前準備
以下のようなDockerfileがあるとする。
FROM centos
CMD echo "1回目だよ"
ONBUILD CMD echo "ONBUILDだよ"
dokcer build 1回目
それをdocker build
する。
$ sudo docker build -t onbuild_test ./docker_file_dir/
こんなかんじのイメージができあがった。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
onbuild_test latest 73429113ed11 8 seconds ago 200MB
centos latest 49f7960eb7e4 8 weeks ago 200MB
それを docker run
してみる。
$ sudo docker run 73429113ed11
1回目だよ
「1回目だよ」というメッセージが出力された。
ONBUILDの部分は無視されていることがわかる。
docker build 2回目
2回目のdocker build
用に以下のようなDockerfileを用意する。
FROM onbuild_test
RUN echo "2回目だよ"
そしてさきほど1回目で作成したDockerイメージをもとにdocker build
する。
$ sudo docker build -t onbuild_test_2 ./docker_file_dir/
こんなかんじのイメージができあがった。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
onbuild_test_2 latest 90ae6685a141 9 seconds ago 200MB
onbuild_test latest 73429113ed11 10 minutes ago 200MB
centos latest 49f7960eb7e4 8 weeks ago 200MB
それをdocker run
してみる。
$ sudo docker run 90ae6685a141
ONBUILDだよ
今回使ったDockerfile内に特に記載もないのに「ONBUILDだよ」というメッセージが出力された。
1回目にdocker build
したときの情報を保持していて、それをもとにあらたなイメージをビルドしたときに処理を実行していることがわかる。
まとめ
ONBUILDはベースとなるイメージをもとにさらに派生でイメージをビルドしたときに実行される。
ベースとなるイメージを管理者が作成して、そこにONBUILDで必要な処理を記載しておく。
それをもとに開発者があたらしいイメージをつくって開発を行う。みんなが好き勝手イメージをつくってもベースとなるイメージをもとにしていれば必要なものは入っているので問題ない。
みたいなことができそう。