RUNコマンドを使うと、wgetやgit cloneでデータを取得した際、実行コマンド単位でキャッシュが作成されるため、最新のデータをダウンロード出来ない問題がある。

docker build –no-cache .

というオプションを使うと、キャッシュを一切使用せずにビルドできるが、任意のコマンドの場所まではキャッシュを使って高速化したい。

方法1

以下のコマンドをDockerfileのキャッシュを利用しない行の一番上に挿入する。

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" /dev/null

これは、ADDとCOPYの命令が、docker imageに転送したファイルのチェックサムを確認する仕様を利用している。チェックサムが同じであればキャッシュを利用し、異なれば新たにキャッシュが作成される。

www.random.orgでは、ランダムな値のテキストファイルを生成してくれるのでこれ以降のコマンドはキャッシュを利用しなくなる。

方法2

以下のコマンドをDockerfileのキャッシュを利用しない行の一番上に挿入する。

ARG hoge=1 

その後実行時、

$ docker build . --build-arg hoge=CHANGE_THIS

のように変数を与え、CHANGE_THISの部分を都度変更する。

ARGは、ビルド時にユーザが渡せる変数を定義する命令で、docker環境で「echo $hoge」などとすれば利用できる。

ビルド実行時、–build-arg CACHEBUST=$(date +%s)のようにして日時を引数に渡せば、「方法1」のような自動化ができるだろう。

参考

https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands

https://docs.docker.jp/engine/articles/dockerfile_best-practice.html