Come forzare Docker per una build pulita di un'immagine



2 Answers

In alcuni casi estremi, l'unico modo per aggirare i guasti ricorrenti è eseguire:

docker system prune

Il comando ti chiederà la conferma:

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]

Questa ovviamente non è una risposta diretta alla domanda, ma potrebbe salvare alcune vite ... Ha salvato la mia.

docker

Ho creato un'immagine Docker da un file Docker utilizzando il comando seguente.

$ docker build -t u12_core -f u12_core .

Quando sto cercando di ricostruirlo con lo stesso comando, sta usando la cache di build come:

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@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 cache mostra che aerospike è installato. Tuttavia, non lo trovo all'interno dei contenitori spawn da questa immagine, quindi voglio ricostruire questa immagine senza usare la cache. Come posso forzare Docker a ricostruire un'immagine pulita senza la cache?




Non raccomanderei l'uso di --no-cache nel tuo caso.

Stai eseguendo un paio di installazioni dai passaggi 3 a 9 (preferirei, in ogni caso, utilizzare un solo liner) e se non vuoi che il sovraccarico di rieseguire questi passaggi ogni volta che crei la tua immagine puoi modificare il Dockerfile con un passaggio temporaneo prima delle istruzioni di wget .

Io uso per fare qualcosa come RUN ls . e cambiarlo in RUN ls ./ quindi RUN ls ./. e così via per ogni modifica fatta sulla tarball recuperata da wget

Ovviamente puoi fare qualcosa come RUN echo 'test1' > test && rm test aumentando il numero in 'test1 per ogni iterazione.

Sembra sporco, ma per quanto ne so è il modo più efficiente per continuare a beneficiare del sistema di cache di Docker, che consente di risparmiare tempo quando si dispone di molti livelli ...






Related


Tags

docker