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?
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)
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.
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.
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é.
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 .
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/