Las imágenes de mi ventana acoplable se crean en un servidor Jenkins CI y se envían a nuestro Registro privado de Docker. Mi objetivo es aprovisionar entornos con docker-compose que siempre inician el estado original de las imágenes.
Actualmente estoy usando docker-compose 1.3.2 y 1.4.0 en diferentes máquinas, pero también utilizamos versiones anteriores.
Siempre utilicé los docker-compose pull && docker-compose up -d
comandos para recuperar las imágenes nuevas del registro y ponerlas en marcha. Creo que mi comportamiento preferido docker-compose up
funcionó como se esperaba hasta cierto punto en el tiempo, pero desde entonces comenzó a volver a ejecutar contenedores detenidos anteriormente en lugar de iniciar las imágenes creadas originalmente cada vez.
¿Hay alguna manera de deshacerse de este comportamiento? ¿Podría ser así uno que esté conectado en el archivo de configuración docker-compose.yml para no depender de "no olvidar" algo en la línea de comando en cada invocación?
PD. Además de encontrar una manera de lograr mi objetivo, también me encantaría saber un poco más sobre los antecedentes de este comportamiento. Creo que la idea básica de Docker es construir una infraestructura inmutable. El comportamiento actual de docker-compose parece simplemente chocar con este enfoque ... ¿o me pierdo algunos puntos aquí?
fuente
docker-compose run -d
no existe? ¿Quieres decir quedocker-compose up -d
no?docker-compose pull
antesdocker-compose rm -f
puedes ahorrar aún más tiempoLa única solución que funcionó para mí fue este comando:
Esto extraerá automáticamente una imagen nueva del repositorio y no usará la versión de caché que está preconstruida con ningún parámetro que haya estado utilizando antes.
fuente
Según la documentación oficial actual , hay un atajo que detiene y elimina contenedores, redes, volúmenes e imágenes creados por arriba, si ya están detenidos o parcialmente eliminados, etc., también funcionará:
Luego, si tiene nuevos cambios en sus imágenes o utiliza Dockerfiles:
Finalmente:
docker-compose up
En un comando:
docker-compose down && docker-compose build --no-cache && docker-compose up
fuente
docker-compose build --no-cache
solo es necesario si hay cambios en Dockerfiles.docker-compose up
, es necesario reconstruir los servicios condocker-compose build
.Puede pasar
--force-recreate
adocker compose up
, que debe usar contenedores nuevos.Creo que el razonamiento detrás de la reutilización de contenedores es preservar cualquier cambio durante el desarrollo. Tenga en cuenta que Compose hace algo similar con los volúmenes, que también persistirá entre la recreación del contenedor (un contenedor recreado se adjuntará a los volúmenes de su predecesor). Esto puede ser útil, por ejemplo, si tiene un contenedor Redis utilizado como caché y no desea perder el caché cada vez que realiza un pequeño cambio. En otras ocasiones es simplemente confuso.
No creo que haya ninguna forma de forzar esto desde el archivo Compose.
Podría decirse que choca con los principios de infraestructura inmutable. El contraargumento es probablemente que no usas Compose en producción (todavía). Además, no estoy seguro de estar de acuerdo en que infra inmutable es la idea básica de Docker, aunque sin duda es un buen caso de uso / punto de venta.
fuente
--force-recreate
no funciona para mí ... La imagen no se extrae a pesar de que hay una versión más nueva ...O
fuente
Si hay algo nuevo, será reconstruido.
fuente