library - Cómo forzar a Docker para una construcción limpia de una imagen
docker-compose (6)
Con docker-compose intente
docker-compose up -d --build --force-recreate
He creado una imagen Docker a partir de un archivo Docker usando el siguiente comando.
$ docker build -t u12_core -f u12_core .
Cuando intento reconstruirlo con el mismo comando, está usando el caché de compilación como:
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
El caché muestra que está instalado aerospike. Sin embargo, no lo encuentro dentro de los contenedores generados a partir de esta imagen, por lo que quiero reconstruir esta imagen sin usar el caché. ¿Cómo puedo forzar a Docker a reconstruir una imagen limpia sin el caché?
El comando
docker build --no-cache .
Resuelto nuestro problema similar.
Nuestro Dockerfile fue:
RUN apt-get update
RUN apt-get -y install php5-fpm
Pero debería haber sido:
RUN apt-get update && apt-get -y install php5-fpm
Para evitar el almacenamiento en caché de la actualización e instalar por separado.
En algunos casos extremos, su única forma de evitar fallas recurrentes de compilación es ejecutando:
docker system prune
El comando le pedirá su confirmación:
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]
Por supuesto, esta no es una respuesta directa a la pregunta, pero podría salvar algunas vidas ... Salvó la mía.
Hay una
--no-cache
:
docker build --no-cache -t u12_core -f u12_core .
En versiones anteriores de Docker necesitabas pasar
--no-cache=true
, pero este ya no es el caso.
No recomendaría usar
--no-cache
en su caso.
Está ejecutando un par de instalaciones desde el paso 3 al 9 (por cierto, preferiría usar un revestimiento) y si no desea la sobrecarga de volver a ejecutar estos pasos cada vez que está construyendo su imagen, puede modifique su
Dockerfile
con un paso temporal antes de su instrucción
wget
.
Solía hacer algo como
RUN ls .
y cámbielo a
RUN ls ./
luego
RUN ls ./.
y así sucesivamente para cada modificación realizada en el tarball recuperado por
wget
Por supuesto, puede hacer algo como
RUN echo ''test1'' > test && rm test
aumentando el número en
''test1
para cada iteración.
Parece sucio, pero que yo sepa, es la forma más eficiente de seguir beneficiándose del sistema de caché de Docker, que ahorra tiempo cuando tiene muchas capas ...
Puede administrar la memoria caché del generador con
docker builder
Para limpiar todo el caché sin aviso:
docker builder prune -af