Dockerfile の先頭で宣言された ARG が変更されたが、その値が Dockerfile の末尾近くの RUN コマンドにのみ使用されている場合、Docker はイメージ全体を最初から再構築しますか、それとも関連する RUN コマンドの直前の中間イメージを再利用できますか?
レイヤー化をより有効に活用するには、ARG 宣言を Dockerfile の先頭に配置する必要がありますか、それとも ARG 宣言を使用するセクションの直前に配置する必要がありますか?
私の質問の一部は、ARG ディレクティブが中間層を生成するかどうかということだと思います。
ベストアンサー1
ARG
一般的には、ファイルの先頭ではなく、使用される直前に配置する方が適切です。
より正確に言うと、宣言後にすべての行のキャッシュが無効になるわけではありません。値と をARG
使用する行のみが無効になります。詳細は docker のドキュメントに記載されています。ARG
RUN
ビルドキャッシュへの影響
ARG
ENV
変数は、変数のようにビルドされたイメージに保持されません。ただし、ARG
変数はビルド キャッシュに同様の影響を与えます。Dockerfile で、以前のビルドと値が異なる ARG 変数を定義した場合、定義時ではなく最初の使用時に「キャッシュ ミス」が発生します。特に、RUN
命令に続くすべての命令は、変数を暗黙的に (環境変数として)ARG
使用するためARG
、キャッシュ ミスが発生する可能性があります。Dockerfile にARG
一致するステートメントがない限り、すべての定義済み変数はキャッシュから除外されます。ARG
レイヤー キャッシュを最適化された状態に保つには、引数を必要としない のARG
下にを移動する必要があります。RUN
詳細情報: