¿Cómo conseguir que docker-compose vuelva a crear siempre contenedores a partir de imágenes nuevas?


Mis imágenes de docker se construyen 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 originalmente construido de las imágenes.

Actualmente estoy usando docker-compose 1.3.2 y 1.4.0 en diferentes máquinas, pero también usamos versiones anteriores anteriormente.

Siempre usé los comandos docker-compose pull && docker-compose up -d para obtener las imágenes frescas del registro y ponerlas en marcha. Creo que mi preferido el comportamiento estaba funcionando como se esperaba hasta cierto punto en el tiempo, pero desde entonces docker-compose up comenzó a volver a ejecutar contenedores previamente detenidos en lugar de iniciar las imágenes originalmente construidas cada vez.

¿Hay alguna manera de deshacerse de este comportamiento? Podría ser de esa manera uno que está conectado en el docker-compose.archivo de configuración yml para no depender de" no olvidar " algo en la línea de comandos en cada invocación?

Ps. Además de encontrar una manera de lograr mi objetivo, también me encantaría conozca 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 simplemente parece chocar con este enfoque.. ¿o me pierdo algunos puntos aquí?

Author: Boris Burkov, 2015-09-16

5 answers

docker-compose up --force-recreate es una opción, pero si lo estás usando para CI, comenzaría la compilación con docker-compose rm -f para detener y eliminar los contenedores y volúmenes (luego seguirlo con pull y up).

Esto es lo que uso:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

La razón por la que se recrean los contenedores es para preservar cualquier volumen de datos que se pueda usar (y también sucede que up es mucho más rápido).

Si estás haciendo CI no quieres eso, por lo que simplemente eliminar todo debería conseguir lo que quieres.

Actualización: use up --build que se añadió en docker-compose 1.7

 134
Author: dnephin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-20 05:15:46

La única solución que funcionó para mí fue este comando :

docker-compose build --no-cache

Esto extraerá automáticamente la imagen fresca del repositorio y no usará la versión de caché que está pre-construida con ningún parámetro que haya estado usando antes.

 57
Author: davidbonachera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 07:57:27

Por la documentación oficial actual hay un atajo que detiene y elimina contenedores, redes, volúmenes e imágenes creadas por up, si ya están detenidos o parcialmente eliminados y así sucesivamente, entonces también hará el truco:

docker-compose down

Entonces si tiene nuevos cambios en sus imágenes o archivos acoplables use:

docker-compose build --no-cache

Finalmente: docker-compose up

En un comando: docker-compose down && docker-compose build --no-cache && docker-compose up

 21
Author: Victor Timoftii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 16:23:22

Puede pasar --force-recreate a docker compose up, que debe utilizar envases frescos.

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 de contenedores (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 la caché cada vez que realice una pequeña cambio. Otras veces es confuso.

No creo que haya ninguna manera de forzar esto desde el archivo de redacción.

Podría decirse que choca con principios de infraestructura inmutables. El contra-argumento es probablemente que no usas Compose en producción (todavía). Además, no estoy seguro de estar de acuerdo en que la infra inmutable sea la idea básica de Docker, aunque ciertamente es un buen caso de uso/punto de venta.

 14
Author: Adrian Mouat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 16:00:18
$docker-compose build

Si hay algo nuevo será reconstruido.

 -2
Author: Mathias Asberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 13:25:42