かべぎわブログ

技術的なことについてかけたらいいな…

DockerfileのONBUILDの動きをみてみる

概要

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で必要な処理を記載しておく。
それをもとに開発者があたらしいイメージをつくって開発を行う。みんなが好き勝手イメージをつくってもベースとなるイメージをもとにしていれば必要なものは入っているので問題ない。
みたいなことができそう。

Docker

Docker