Controlar dónde Docker inicia comstackciones incrementales (caso de uso: git clone dentro de Dockerfile)

Por lo que entiendo, docker build es inteligente al build imágenes de forma incremental, es decir, comstack solo aquellas capas donde ocurrieron los cambios. Por ejemplo, si el file fuente de una statement COPY en Dockerfile cambió, y todo lo demás permaneció igual, Docker solo ejecutará las declaraciones a partir de esa COPY y de lo contrario reutilizará las capas comstackdas previamente.

Tengo un escenario en el que RUN git clone dentro de la image de Docker en el momento de la compilation y me gustaría que Docker docker build su compilation incremental a partir de esa statement (si se modificó algún file fuente).

Creo que podría hacer cumplir esto colocando una COPY dummy / justo antes de esa statement y decirle a Docker acerca de los cambios en los files de origen con touch dummy . ¿Hay una mejor manera de hacer esto?

Eche un vistazo a la instrucción ARG en Dockerfiles. Específicamente esta sección sobre su impacto en el almacenamiento en caching .

Pude resolver esto siguiendo el liderazgo de @JHarris. My Dockerfile ahora se ve así:

 FROM ... ARG ... ENV ... # run lengthy installs RUN apt-get update RUN apt-get install -y ... # ... ARG HEAD RUN TMP_DIR=$(mktemp -d) && \ cd $TMP_DIR && \ git clone $GIT_REPOSITORY && \ # compile source code # install from compile cd $TMP_DIR && \ rm -fr $TMP_DIR # ... 

Y comienzo el process de compilation con:

 docker build --build-arg HEAD=$(git ls-remote $GIT_REPOSITORY refs/heads/master | \ cut -f1) . 

En efecto, HEAD recibe un nuevo valor (hash) cada vez que $GIT_REPOSITORY un nuevo empujón a $GIT_REPOSITORY . Si eso sucede, comienza una compilation "incremental" comenzando desde la línea después de ARG HEAD . El factoid key fue esta oración de la reference de Dockerfile (sección ARG , subsección Impacto en el almacenamiento en caching de compilation ):

Si un Dockerfile define una variable ARG cuyo valor es diferente de una compilation anterior, entonces se produce una "falta de caching" en su primer uso, no su definición. En particular, todas las instrucciones RUN que siguen a una instrucción ARG usan la variable ARG implícitamente (como una variable de entorno), por lo tanto, pueden causar una falta de caching.

Esto indica que ARG HEAD debe colocarse lo más abajo posible en Dockerfile . A pesar de que es una definición, y podría colocarse más arriba por sí mismo, todas las instrucciones RUN que le siguen ya countn como usos de HEAD . Por lo tanto, en mi ejemplo, es importante colocarlo después de RUN apt-get para instalaciones largas, en particular.