題目の通り「docker image buildで–pull=trueでイメージの再取得をしてもコンテキストファイルが更新されない問題」が発生しましたので、解消法について備忘録としてまとめます。
結論
いきなり結論を書きますが、なんとなくキャッシュの問題かな?と思ったらキャッシュの問題でした。
一度既に作成したイメージを削除したうえで、キャッシュを無効にしてdocker imge build
を実行する際に--no-cache
を指定して実行する必要がありました。
イメージの再取得でいけると勘違い
コンテキストファイル (スクリプトを実行するファイル)にタイポがあり、その内容を修正してdocker image build --pull=true
を使用することで、すでに作成されてしまっているイメージの再取得を行うことで、Dockerfileに記述したCOPYの内容がコンテナ内に更新されると思っておりましたが、何度やっても更新されません。
タイポしていた内容
誤った記述
#! /bin/bash echo "[`date`]" Hello!"
正しい記述
#! /bin/bash echo "[`date`] Hello!"
「”」の位置を間違えてます。
docker image build --pull=true
でオプションを指定して、docker container exec -it コンテナ名 bash
でコンテナ内に入ってファイルの中身をcat
するも更新されていない。
よく見ると初回のdocker image build
と2回目以降のdocker image build --pull=true
の実行結果を見比べてみると、ちゃんとキャッシュしているよというのがターミナルに表示されていました。
初回実行時のbuildの結果
$ docker image build -t ch03/cronjob:latest . [+] Building 106.6s (11/11) FINISHED => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 217B 0.0s => [internal] load metadata for docker.io/library/ubuntu:23.10 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/6] FROM docker.io/library/ubuntu:23.10 0.0s => [internal] load build context 0.2s => => transferring context: 169B 0.0s => [2/6] RUN apt update 100.2s => [3/6] RUN apt install -y cron 4.9s => [4/6] COPY task.sh /usr/local/bin/ 0.1s => [5/6] COPY cron-example /etc/cron.d/ 0.1s => [6/6] RUN chmod 0644 /etc/cron.d/cron-example 0.3s => exporting to image 0.4s => => exporting layers 0.3s => => writing image sha256:49181069a33be78630d00de3116c56180d139386aac43689817d219de396ca09 0.0s => => naming to docker.io/ch03/cronjob:latest
2回目以降のbuildの結果
docker image build --pull=true -t ch03/cronjob:latest . => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 217B 0.0s => [internal] load metadata for docker.io/library/ubuntu:23.10 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/6] FROM docker.io/library/ubuntu:23.10 0.0s => [internal] load build context 0.0s => => transferring context: 59B 0.0s => CACHED [2/6] RUN apt update 0.0s => CACHED [3/6] RUN apt install -y cron 0.0s => CACHED [4/6] COPY task.sh /usr/local/bin/ 0.0s => CACHED [5/6] COPY cron-example /etc/cron.d/ 0.0s => CACHED [6/6] RUN chmod 0644 /etc/cron.d/cron-example 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:51ff3f95463003901f28dec9f4ba9b3a576ab7d4b0303ad8d6d2318331ba8070 0.0s => => naming to docker.io/ch03/cronjob:latest
実行時間においてもCACHEDされているので0.0sと0秒で終了しています。
当然キャッシュされているので、
$ docker container exec -it cronjob bash root@a72dace5042a:/# cat /usr/local/bin/task.sh #! /bin/bash echo "[`date`]" Hello!"
まだタイポしています。
キャッシュを無効化して実行する
一旦、docker image rm
でイメージを削除し、キャッシュを無効化してbuild
を実行してみましょう。
$ docker image build --no-cache -t ch03/cronjob:latest . [+] Building 29.6s (11/11) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 217B 0.0s => [internal] load metadata for docker.io/library/ubuntu:23.10 2.7s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => CACHED [1/6] FROM docker.io/library/ubuntu:23.10@sha256:5cd569b792a8b7b483d90942381cd7e0b03f0a15520d6e23fb7a1464a25a71b1 0.0s => => resolve docker.io/library/ubuntu:23.10@sha256:5cd569b792a8b7b483d90942381cd7e0b03f0a15520d6e23fb7a1464a25a71b1 0.0s => [internal] load build context 0.0s => => transferring context: 59B 0.0s => [2/6] RUN apt update 20.8s => [3/6] RUN apt install -y cron 4.9s => [4/6] COPY task.sh /usr/local/bin/ 0.1s => [5/6] COPY cron-example /etc/cron.d/ 0.1s => [6/6] RUN chmod 0644 /etc/cron.d/cron-example 0.3s => exporting to image 0.4s => => exporting layers 0.3s => => writing image sha256:327b21f2be4e21f3991fedb7a17ab2a974b9b54e8fb0bfad25d0fdd0d05519a9 0.0s => => naming to docker.io/ch03/cronjob:latest
上記が実行結果ですが、今度はRUN以降の実行がCACHED
されずに実行されているのがわかります。
タイポが解消されていることが確認できました。
root@a72dace5042a:/# cat usr/local/bin/task.sh #! /bin/bash echo "[`date`]" Hello!"
今後キャッシュではまらないための備忘録でした。