2017-01-11 6 views
4

Dockerfileの先頭で宣言されたARGが変更されたが、その値がDockerfileの終わり付近のRUNコマンドでのみ使用されている場合、Dockerはイメージ全体を最初から再構築するか、再利用できるか関連するRUNコマンドの直前の中間イメージ?Dockerfileの上にARGを置くと、レイヤーの再利用ができませんか?

レイヤリングを有効に活用するには、ARG宣言をDockerfileの一番上に配置するのか、それともそれらを使用するセクションの直前に配置するのですか?

私の質問の一部は、ARGディレクティブが中間層を生成するかどうかです。

答えて

4

ビルド引数の値を変更すると、そのARG行が無効化された後のすべてのレイヤーが変更されます。だから私はあなたがARGを使う直前にそれを含めるべきだと思います。

あなたがそれを必要とする直前に:上部に

docker build --build-arg TEST_ARG=test . 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM ubuntu 
---> 104bec311bcd 
Step 2 : RUN echo "no arg used" 
---> Using cache 
---> 5c29cb363a27 
Step 3 : ARG TEST_ARG 
---> Using cache 
---> 73b6080f973b 
Step 4 : RUN echo $TEST_ARG 
---> 0acd55c24441 
Successfully built 0acd55c24441 

docker build --build-arg TEST_ARG=test . 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM ubuntu 
---> 104bec311bcd 
Step 2 : ARG TEST_ARG 
---> Using cache 
---> b611a1023fe3 
Step 3 : RUN echo "no arg used" 
---> Running in 63e0f803c6b2 
no arg used 
---> 592311ccad72 
Removing intermediate container 63e0f803c6b2 
Step 4 : RUN echo $TEST_ARG 
---> Running in 1515aa8702f0 
test 
---> fc2d850fbbeb 
Removing intermediate container 1515aa8702f0 
Successfully built fc2d850fbbeb 

最初の例では、二つの層がキャッシュから2つ目一層のみ(funnily十分に使用されています、ARGレイヤー自体)がキャッシュから使用されます。

関連する問題