J'ai créé une image Docker à partir d'un fichier Docker à l'aide de la commande ci-dessous.
$ docker build -t u12_core -f u12_core .
Lorsque j'essaie de le reconstruire avec la même commande, il utilise le cache de génération comme:
Step 1 : FROM ubuntu:12.04
---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <[email protected]>
---> Using cache
---> 4354ccf9dcd8
Step 3 : RUN apt-get update
---> Using cache
---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
---> Using cache
---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
---> Using cache
---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
---> Using cache
---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
---> Using cache
---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
---> Using cache
---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
---> Using cache
---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
---> Using cache
---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
---> Using cache
---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
---> Using cache
---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
---> Using cache
---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
---> Using cache
---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
---> Using cache
---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
---> Using cache
---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
---> Using cache
---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
---> Using cache
---> 25f5fe70fa84
Successfully built 25f5fe70fa84
Le cache montre que l'aérospike est installé. Cependant, je ne le trouve pas à l'intérieur des conteneurs générés à partir de cette image, donc je veux reconstruire cette image sans utiliser le cache. Comment puis-je forcer Docker à reconstruire une image propre sans le cache?
RUN
directives.RUN
directive, donc uneDockerfile
avec de nombreusesRUN
directives consommerait des quantités gigantesques d'espace disque; mais cela a apparemment été quelque peu amélioré dans les versions récentes.docker-compose up -d
, où puis-je l'utiliser--no-cache
?docker-compose build --no-cache
et ensuitedocker-compose up -d
Réponses:
Il y a une
--no-cache
option:Dans les anciennes versions de Docker, vous deviez réussir
--no-cache=true
, mais ce n'est plus le cas.la source
--no-cache
fonctionne avecdocker-compose build
.--pull
. Cela indiquera à docker d'obtenir la dernière version de l'image de base. Ceci est nécessaire en plus--no-cache
si vous avez déjà l'image de base (ex:)ubuntu/latest
et que l'image de base a été mise à jour depuis votre dernière extraction. Voir les documents ici .--pull
option a fait l'affaire pour moi. Juste--no-cache
, la construction s'est encore cassée. Mettez--pull
aussi, la construction a fonctionné! Je vous remercie!Dans certains cas extrêmes, votre seul moyen de contourner les échecs de génération récurrents est d'exécuter:
La commande vous demandera votre confirmation:
Ce n'est bien sûr pas une réponse directe à la question, mais cela pourrait sauver des vies ... Cela a sauvé la mienne.
la source
Docker version 17.09.0-ce, build afdb6d4
docker
à jour la même version et ça marche, merci.docker builder prune
pour effacer les couches de construction mises en cache. Je viens de tomber dans le piège après avoir copié aveuglément les commandes du débordement de pile.La commande a
docker build --no-cache .
résolu notre problème similaire.Notre Dockerfile était:
Mais aurait dû être:
Pour empêcher la mise en cache de la mise à jour et installer séparément.
Voir: Meilleures pratiques pour écrire des Dockerfiles
la source
RUN apt-get update && apt-get -y install php5-fpm
vous, il verra toujours qu'il est réutilisé avec l'ancien contenu.Pour vous assurer que votre build est complètement reconstruit, y compris la vérification de l'image de base pour les mises à jour, utilisez les options suivantes lors de la construction:
--no-cache
- Cela forcera la reconstruction des couches déjà disponibles--pull
- Cela déclenchera une extraction de l'image de base référencée à l'aide de FROM pour vous assurer que vous avez la dernière version.La commande complète ressemblera donc à ceci:
Les mêmes options sont disponibles pour docker-compose:
la source
Je ne recommanderais pas d'utiliser
--no-cache
dans votre cas.Vous exécutez quelques installations de l'étape 3 à 9 (en passant, je préférerais utiliser une seule ligne) et si vous ne voulez pas la surcharge de réexécuter ces étapes chaque fois que vous construisez votre image, vous pouvez modifier votre
Dockerfile
avec une étape temporaire avant votrewget
instruction.J'utilise pour faire quelque chose comme
RUN ls .
et le changer enRUN ls ./
puisRUN ls ./.
et ainsi de suite pour chaque modification effectuée sur l'archive récupérée parwget
Vous pouvez bien sûr faire quelque chose comme
RUN echo 'test1' > test && rm test
augmenter le nombre'test1
pour chaque itération.Cela a l'air sale, mais pour autant que je sache, c'est le moyen le plus efficace de continuer à bénéficier du système de cache de Docker, ce qui fait gagner du temps lorsque vous avez plusieurs couches ...
la source
Avec docker-compose try
docker-compose up -d --build --force-recreate
la source
La plupart des informations fournies ici sont correctes.
Voici une compilation d'entre eux et ma façon de les utiliser.
L'idée est de s'en tenir à l'approche recommandée (spécifique à la construction et sans impact sur les autres objets docker stockés) et d'essayer l'approche la plus radicale (non spécifique à la construction et ayant un impact sur les autres objets docker stockés) lorsqu'elle ne suffit pas.
Approche recommandée:
1) Forcer l'exécution de chaque étape / instruction dans le Dockerfile:
ou avec
docker-compose build
:Nous pourrions également combiner cela à la
up
sous-commande qui recrée tous les conteneurs:De cette façon, n'utilisez pas le cache, mais pour le générateur de docker et l'image de base référencée avec l'
FROM
instruction.2) Essuyez le cache du générateur de docker (si nous utilisons Buildkit, nous en avons très probablement besoin):
3) Si nous ne voulons pas utiliser le cache des images parentes, nous pouvons essayer de les supprimer telles que:
Dans la plupart des cas, ces 3 choses sont parfaitement suffisantes pour permettre une construction propre de notre image.
Nous devons donc essayer de nous en tenir à cela.
Approche plus radicale:
Dans les cas d'angle où il semble que certains objets dans le cache du docker sont toujours utilisés pendant la génération et que cela semble reproductible, nous devrions essayer de comprendre la cause pour pouvoir effacer la partie manquante de manière très spécifique. Si nous ne trouvons vraiment pas de moyen de reconstruire à partir de zéro, il existe d'autres moyens, mais il est important de se rappeler que ceux-ci suppriment généralement beaucoup plus que ce qui est nécessaire. Nous devons donc les utiliser avec prudence dans l'ensemble lorsque nous ne sommes pas dans un environnement local / dev.
1) Supprimez toutes les images sans au moins un conteneur qui leur est associé:
2) Retirez bien d'autres choses:
Ça dit :
L'utilisation de cette commande de super suppression peut ne pas être suffisante car elle dépend fortement de l'état des conteneurs (en cours d'exécution ou non). Lorsque cette commande ne suffit pas, j'essaie de réfléchir soigneusement aux conteneurs Docker qui pourraient provoquer des effets secondaires sur notre build Docker et de permettre à ces conteneurs d'être fermés afin de permettre leur suppression avec la commande.
la source
Vous pouvez gérer le cache du générateur avec
docker builder
Pour nettoyer tout le cache sans invite:
docker builder prune -af
la source