DockerfileのARGはビルドキャッシュにどう影響するのか、どこに書くべきなのか

スポンサーリンク

Dockerビルド時にパラメータを与えたいときにDockerfileで定義し、–build-argオプションと合わせて使うARG。

それをどこに書くか考えたときに

  • 最初に宣言されていたほうが読みやすい気もする
  • それで不要なキャッシュミスが起こるとしたら嫌

と悩んだのでどういう仕様でどうすべきなのか調べてみました。

そもそも基本

ARGは書いた行以降で有効になります

↓なのでこういうのはエラーになります。

ARGとキャッシュ

公式ドキュメントには、
ARGが変わった場合、(定義ではなく)最初の使用の時にキャッシュミスが起こる。ただし全てのRUNはARGの値を環境変数として暗黙的に使っているのでキャッシュミスを起こす。
というようなことが書かれています。

実験

ARGを最初に宣言

まずARGを上のほうで定義して、–build-argを変更するとどうなるか見てみます。

Dockerfile

これを–build-argを変えて2度ビルドしてみます。

ドキュメント通り、ARGを使っていないRUNでもキャッシュが使われていませんね。

ARGを使用する直前で宣言

ARGをそれを使用するRUNの直前に変えてみます。

Dockerfile

ビルド

最初の例ではキャッシュミスになっていたRUN touch a.txtがUsing cacheになっています。

結論

ARGを直接使わないRUNにもキャッシュミスを起こすので、ARGは使用するRUNの直前で書いたほうが良い。

スポンサーリンク

シェアする

フォローする