Comment puis-je empêcher un Dockerfile l'instruction de la mise en cache?
Dans mon Dockerfile
- je utiliser curl
ou ADD
pour télécharger la dernière version de l'archive, comme:
FROM debian:jessie
...
RUN apt-get install -y curl
...
RUN curl -sL http://example.com/latest/archive.tar.gz --output archive.tar.gz
...
ADD http://example.com/latest/archive2.tar.gz
...
La RUN
instruction qui utilise curl
ou ADD
crée son propre calque de l'image. Qui sera utilisé en tant que cache pour les exécutions futures de docker build
.
Question: Comment puis-je désactiver la mise en cache pour les instructions?
Il serait bien d'obtenir quelque chose comme l'invalidation du cache de d'y travailler. E. g. en utilisant HTTP ETags ou en interrogeant le dernière modification champ d'en-tête. Que donnerait la possibilité de faire un rapide test basé sur les en-têtes HTTP de décider de la mise en cache couche peut être utilisé ou pas.
Je sais que certains trucs sales pourraient aider par exemple, l'exécution d'un téléchargement d'un script shell dans le RUN
déclaration de la place. Son nom de fichier sera modifié avant la docker build
est déclenchée par notre système de construction. Et je pourrais en faire HTTP contrôles à l'intérieur de ce script. Mais ensuite, j'ai besoin de stocker de la dernière utilisée ETag ou la dernière modification dans un fichier quelque part. Je me demande s'il y a certains plus propre et natif Docker fonctionnalité que je pourrais utiliser, ici.
OriginalL'auteur h3nrik | 2015-08-03
Vous devez vous connecter pour publier un commentaire.
Un moment de la construction, l'argument peut être spécifié par la force de briser le cache à partir de cette étape à partir de. Par exemple, dans votre Dockerfile, mettre
et puis donner à cet argument une nouvelle valeur à chaque nouvelle version. Le meilleur, bien sûr, est le timestamp.
Assurez-vous que la valeur est une chaîne de caractères sans les espaces, sinon docker client à tort de prendre comme plusieurs arguments.
Voir une discussion détaillée sur les Question 22832.
Avec horodatage nous pouvons être à 100% dans le reste assuré que la valeur sera toujours unique, outre les informations d'horodatage peut être pratique si il va être utilisé quelque part dans le conteneur.
Cela ne fonctionne pas sur docker version 18.06.1-ce
N'ont pas suivi les nouvelles versions de Docker. Mais l'idée derrière cette solution est d'essayer de fournir une nouvelle valeur à casser le cache à chaque fois que la construction est exécutée, ce qui peut être mis en œuvre dans beaucoup de façons. Aussi longtemps que longtemps Docker mécanisme de mise en cache ne change pas, d'une manière similaire peut être trouvé.
OriginalL'auteur
docker build --no-cache invalide le cache pour tous les commandes.
Dockerfile AJOUTER une commande l'habitude d'avoir le cache invalidé. Bien que il a été améliorée au cours des dernières docker version:
Ainsi, si le fichier ajouté a changé, le cache doit être invalidé pour le
ADD
commande.Question 1326 mentionne d'autres conseils:
Je suis d'accord. Dans "docker temps", qui semble si longtemps.
#redo
- génial! Merci.OriginalL'auteur
Passage d'argument à partir de la génération de fichier ne fonctionne pas avec moi pour une raison quelconque. J'ai résolu le mien par l'ajout de la commande je ne veux pas de cache pour le dernier CMD instruction.
Par exemple:
Maintenant, je suis en cours d'exécution foo.py que je ne veux pas être mis en cache, puis bar.sh. Pas propre, mais ça fonctionne.
OriginalL'auteur
ajouter
&& exit 0
après une commande invalide le cache à partir de là.Exemple:
RUN apt-get install -y unzip && exit 0
Pas fonctionne aussi bien avec Docker version 1.13.0
Pourquoi l'enfer serait-ce que le travail? Vous venez de modifier la commande, mais la sortie 0 ne contribuerait en rien la DEUXIÈME fois après que vous avez ajouté.
OriginalL'auteur