僕のDockerについてのゆるい知識にによると、内部的にDockerFileに記述されたステップごとにイメージを持っているため、DockerFileに記述を追加したときには差分だけの反映で済むので比較的高速にイメージの再構成ができたと思う(まちがってたらすみません)
つまり、こんなDockerFileでイメージを作っていて
FROM centos/mysql-57-centos7:latest MAINTAINER doilux COPY sql/*sh /opt/app-root/src/mysql-init/ CMD ["run-mysqld"]
COPYのあとにRUNを足してイメージを作ると
FROM centos/mysql-57-centos7:latest MAINTAINER doilux COPY sql/*sh /opt/app-root/src/mysql-init/ RUN echo "Hello!!" CMD ["run-mysqld"]
COPYの部分まで反映したイメージを使って、差分を反映してイメージをつくるはず。 実際にイメージを作って見ると、COPYまではcacheを使っているように見える。
$ docker build ./ -t my-image2 20:33:46 Sending build context to Docker daemon 5.12kB Step 1/6 : FROM centos/mysql-57-centos7:latest ---> d3bdf6433e42 Step 2/6 : MAINTAINER doilux ---> Using cache ---> bf75d2490907 Step 3/6 : ENV MYSQL_ROOT_PASSWORD=password MYSQL_DATABASE=doilux MYSQL_PASSWORD=doilux MYSQL_USER=doilux ---> Using cache ---> 29940e9713f8 Step 4/6 : COPY sql/*sh /opt/app-root/src/mysql-init/ ---> Using cache ---> 03cd23e70c26 Step 5/6 : RUN echo "Hello!!" ---> Running in be2bd23b44de Hello!! Removing intermediate container be2bd23b44de ---> 1ebeb6e00f05 Step 6/6 : CMD ["run-mysqld"] ---> Running in 727eb999fc09 Removing intermediate container 727eb999fc09 ---> e33e4cbd0edb Successfully built e33e4cbd0edb Successfully tagged my-image2:latest
ふむ、、、とすると、COPY sql/*sh /opt/app-root/src/mysql-init/としている部分、sqlディレクトリ配下にシェルスクリプトを追加してもDockerFile自体は変わっていないのでイメージに反映されないんじゃないかという気がします。
ということで実験してみます。sql配下にファイルを追加します。
#!/bin/bash echo "test dayo"
イメージつくる。cacheは使っていないようです。
$ docker build ./ -t my-image3 Sending build context to Docker daemon 6.144kB Step 1/5 : FROM centos/mysql-57-centos7:latest ---> d3bdf6433e42 Step 2/5 : MAINTAINER doilux ---> Using cache ---> bf75d2490907 Step 3/5 : ENV MYSQL_ROOT_PASSWORD=password MYSQL_DATABASE=doilux MYSQL_PASSWORD=doilux MYSQL_USER=doilux ---> Using cache ---> 29940e9713f8 Step 4/5 : COPY sql/*sh /opt/app-root/src/mysql-init/ ---> cadce1fd8d18 Step 5/5 : CMD ["run-mysqld"] ---> Running in 713db1fa62c3 Removing intermediate container 713db1fa62c3 ---> dbe86708aec5 Successfully built dbe86708aec5 Successfully tagged my-image3:latest
コンテナを起動してみる。
$ docker run my-image3 ... => sourcing 3_test.sh ... test dayo ...
ちゃんとシェルを実行してくれました。
ということで、DockerFileに変更がなくても、DockerFileが使っている外部リソースに変更があったら、ちゃんとそこからの差分を反映してイメージを作ってくれます。うん、優秀だ。