自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

docker image build キャッシュ

docker image buildで–pull=trueでイメージの再取得をしてもコンテキストファイルが更新されない問題

題目の通り「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!"

今後キャッシュではまらないための備忘録でした。

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuki_Izumi

32歳から医療業界からエンジニアに転職しました。

野球、バスケ、将棋、絵を描くこと、などなど
色々多趣味ですが、結婚してエンジニアになってからは
すべて疎遠になりました。

生活に余裕ができたらすこーしずつ趣味も実践していきたいと
思っている未熟エンジニアです。

記事一覧