web-dev-qa-db-fra.com

Comment empêcher Dockerfile de mettre en cache le clone Git

J'ai un Dockerfile essayant de créer un package et de déployer une application Web dans un conteneur. Le code de l'application récupère du référentiel git pendant la construction de l'image Docker. Voici l'instantané Dockerfile:

........
RUN git clone --depth=1 git-repository-url $GIT_HOME/
RUN mvn package -Dmaven.test.skip
........

Je veux que le docker ne mette pas en cache l'étape de RUN git clone --depth=1 git-repository-url $GIT_HOME/ afin que les mises à jour en cours sur le référentiel puissent se refléter dans le bâtiment d'image Docker. Est-il possible d'y parvenir?

26
Raindy

Une autre solution:

Si vous utilisez github (ou gitlab ou bitbucket le plus probable), vous pouvez AJOUTER la représentation de votre repo par l'API github à un emplacement factice.

   ADD https://api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json
   RUN git clone -b$BRANCH https://github.com/$USER/$REPO.git $GIT_HOME/

L'appel API retournera des résultats différents lorsque la tête change, invalidant le cache du docker.

Si vous avez affaire à des dépôts privés, vous pouvez utiliser github's x-oauth-basic schéma d'authentification avec un jeton d'accès personnel comme ceci:

   ADD https://$ACCESS_TOKEN:[email protected]/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json

(thx @captnolimar pour une modification suggérée afin de clarifier l'authentification)

35
anq

Numéro 1996 n'est pas encore disponible, mais vous avez le solution de contournement suivante :

FROM foo
ARG CACHE_DATE=2016-01-01
RUN git clone ...

docker build --build-arg CACHE_DATE=$(date) ....

Cela invaliderait le cache après le ARG CACHE_DATE ligne pour chaque build.

Ou:

ADD http://www.convert-unix-time.com/api?timestamp=now /tmp/bustcache
RUN git pull

Cela invaliderait également le cache après cette ligne ADD.

Idée similaire :

Ajoutez la commande ARG à votre Dockerfile:

# Dockerfile
# add this and below command will run without cache
ARG CACHEBUST=1

Lorsque vous devez reconstruire avec le cache sélectionné, exécutez-le avec --build-arg option

$ docker build -t your-image --build-arg CACHEBUST=$(date +%s) .

alors seule la couche sous la commande ARG dans Dockerfile sera reconstruite.

13
VonC

Si vous utilisez github, vous pouvez utiliser l'API github pour ne pas mettre en cache la commande RUN spécifique. Vous devez avoir installé jq pour analyser JSON: apt-get install -y jq

Exemple:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName .

Dans Dockerfile (la commande ARG doit être juste avant RUN):

ARG SHA=LATEST
RUN SHA=${SHA} \
    git clone https://github.com/Tencent/mars.git

ou si vous ne voulez pas installer jq

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1)

Si le dépôt a de nouveaux commits, git clone sera exécuté.

4
Michal Z m u d a

J'ai rencontré ce même problème moi-même et j'ai décidé d'utiliser le --no-cache option lorsque je crée l'image, plutôt que d'essayer de distinguer le dépôt git.

docker build --no-cache -t my_image .
3
tomgsmith99

Pour les dépôts privés github, vous pouvez également saisir votre nom d'utilisateur et votre mot de passe:

RUN git clone -b$BRANCH https://$USER:[email protected]/$USER/$REPO.git $GIT_HOME/

1
manymoons