Comment forcer Docker pour une construction propre d'une image

J'ai construit une image Docker à partir d'un fichier Docker en utilisant la commande ci-dessous.

$ docker build -t u12_core -f u12_core .

Quand j'essaie de le reconstruire avec la même commande, il utilise le cache de construction comme:

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
 ---> 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@sessions*requireds*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 indique que aerospike 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?

344
demandé sur Peter Mortensen 2016-02-24 09:37:48

4 réponses

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.

628
répondu Assaf Lavie 2018-07-24 15:38:00

Dans certains cas extrêmes, votre seul moyen de contourner les échecs de construction récurrents est d'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 cela pourrait sauver des vies... Il a sauvé le mien.

59
répondu Wallace Sidhrée 2017-11-23 10:13:24

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 écrire des fichiers Dockerfiles

39
répondu Youniteus 2018-07-24 15:39:43

Je ne recommanderais pas d'utiliser --no-cache dans votre cas.

Vous exécutez quelques installations de l'étape 3 à 9 (je préférerais, en passant, utiliser un one liner) et si vous ne voulez pas que ces étapes soient relancées chaque fois que vous construisez votre image, vous pouvez modifier votre {[1] } avec une étape temporaire avant votre instruction wget.

Je utiliser pour faire quelque chose comme RUN ls . et remplacez - 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.

Il semble 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...

5
répondu Olivier 2018-07-24 15:40:43