Si se cambia un ARG que se declara en la parte superior de un Dockerfile, pero su valor solo se usa para un comando EJECUTAR cerca del final del Dockerfile, ¿Docker reconstruye toda la imagen desde cero o puede reutilizar el intermedio? imagen justo antes del comando RUN correspondiente?
Para utilizar mejor las capas, ¿debería colocar mis declaraciones ARG en la parte superior del Dockerfile o justo antes de la sección que las usa?
Supongo que parte de mi pregunta es si una directiva ARG genera o no una capa intermedia.
Si cambia el valor de un argumento de construcción, todas las capas después de esa línea ARG se invalidarán. Así que supongo que deberías incluirlo justo antes de usar el ARG.
Justo antes de que lo necesites:
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 0acd55c24441En la cima:
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 fc2d850fbbebEn el primer ejemplo se usan dos capas del caché y en el segundo solo se usa una capa (curiosamente, la propia capa ARG) del caché.
Para ser más precisos que la respuesta aceptada, no todas las líneas se invalidan en caché después de una declaración ARG . Solo aquellos que usan valores ARG y RUN s. La documentación de la ventana acoplable los detalles:
Impacto en el almacenamiento en caché de compilación
Las variables
ARGno se conservan en la imagen construida como lo son las variablesENV. Sin embargo, las variablesARGimpactan en la memoria caché de compilación de manera similar. Si un Dockerfile define una variable ARG cuyo valor es diferente de una compilación anterior, se produce un "error de caché" en su primer uso, no en su definición. En particular, todas las instruccionesRUNque siguen a una instrucciónARGusan la variableARGimplícitamente (como una variable de entorno), por lo que pueden provocar una pérdida de memoria caché. Todas las variablesARGpredefinidas están exentas del almacenamiento en caché a menos que haya una declaraciónARGcoincidente en el Dockerfile.
Tendrá que mover sus ARG debajo de RUN que no necesitarían el argumento para mantener optimizada la caché de capa.
Para más información: