J'ai construit 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 construction comme suit:
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
La mémoire cache montre que l’aérospike est installé. Cependant, je ne le trouve pas dans les conteneurs générés à partir de cette image. Je souhaite donc reconstruire cette image sans utiliser le cache. Comment puis-je forcer Docker à reconstruire une image vierge sans le cache?
Il y a une option --no-cache
:
docker build --no-cache -t u12_core -f u12_core .
Dans les anciennes versions de Docker, vous deviez passer --no-cache=true
, mais ce n'est plus le cas.
Dans certains cas extrêmes, votre seul moyen d'éviter les échecs de construction récurrents consiste à exécuter:
docker system Prune
La commande vous demandera votre confirmation:
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all images without at least one container associated to them
Are you sure you want to continue? [y/N]
Ce n'est bien sûr pas une réponse directe à la question, mais pourrait sauver des vies… Cela a sauvé la mienne.
La commande docker build --no-cache .
a résolu notre problème similaire.
Notre Dockerfile était:
RUN apt-get update
RUN apt-get -y install php5-fpm
Mais aurait dû être:
RUN apt-get update && apt-get -y install php5-fpm
Pour empêcher la mise en cache de la mise à jour et l’installer séparément.
Voir: Meilleures pratiques pour l'écriture de fichiers Dockerfiles
Je ne recommanderais pas d'utiliser --no-cache
dans votre cas.
Vous exécutez quelques installations des étapes 3 à 9 (je préférerais, par ailleurs, l’utilisation d’une couche unique) et si vous ne souhaitez pas que le temps système nécessaire pour répéter ces étapes à chaque fois que vous construisez votre image, vous pouvez le faire. modifiez votre Dockerfile
avec une étape temporaire précédant votre instruction wget
.
J'avais l'habitude de faire quelque chose comme RUN ls .
et de le changer en RUN ls ./
puis RUN ls ./.
et ainsi de suite pour chaque modification effectuée sur l'archive récupérée par wget
Vous pouvez bien sûr faire quelque chose comme RUN echo 'test1' > test && rm test
en augmentant le nombre dans '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 permet de gagner du temps lorsque vous avez plusieurs couches ...
Avec docker-compose, essayez docker-compose up -d --build --force-recreate
Vous pouvez gérer le cache du générateur avec docker builder
Pour nettoyer tout le cache sans invite: docker builder Prune -af