web-dev-qa-db-fra.com

Comment forcer Docker pour une construction nette d'une image

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?

587
Pavan Gupta

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.

1083
Assaf Lavie

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.

104
Wallace Sidhrée

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

53
Youniteus

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

11
Olivier

Avec docker-compose, essayez docker-compose up -d --build --force-recreate

2
Yash

Vous pouvez gérer le cache du générateur avec docker builder

Pour nettoyer tout le cache sans invite: docker builder Prune -af

0
Shawn