No sé qué estoy haciendo mal, pero simplemente no puedo docker-compose up
usar la última imagen de nuestro registro sin antes eliminar por completo los contenedores antiguos del sistema. Parece que componer está usando la imagen iniciada anteriormente, aunque la extracción de docker-compose ha obtenido una imagen más nueva.
Miré ¿Cómo hacer que docker-compose siempre vuelva a crear contenedores a partir de imágenes nuevas? que parecía ser similar a mi problema, pero ninguna de las soluciones proporcionadas allí funciona para mí, ya que estoy buscando una solución que pueda usar en el servidor de producción y allí no quiero eliminar todos los contenedores antes de iniciarlos de nuevo (¿posible pérdida de datos?). Me gustaría componer solo para detectar la nueva versión de las imágenes cambiadas, extraerlas y luego reiniciar los servicios con esas nuevas imágenes.
Creé un proyecto de prueba simple para esto en el que el único objetivo es obtener una versión nr para aumentar en cada nueva construcción. La versión nr se muestra si navego hasta el servidor nginx que se crea (esto funciona como se esperaba localmente).
versión de docker: 1.11.2 versión de docker-compose: 1.7.1 SO: probado en CentOS 7 y OS X 10.10 usando docker-toolbox
Mi docker-compose.yml:
version: '2'
services:
application:
image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
volumes:
- /var/www/html
tty: true
nginx:
build: nginx
ports:
- "80:80"
volumes_from:
- application
volumes:
- ./logs/nginx/:/var/log/nginx
php:
container_name: buildchaintest_php_1
build: php-fpm
expose:
- "9000"
volumes_from:
- application
volumes:
- ./logs/php-fpm/:/var/www/logs
en nuestro servidor jenkins ejecuto lo siguiente para compilar y etiquetar la imagen
cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest
esto parece estar haciendo lo que se supone que debe hacer, ya que obtengo una nueva etiqueta de versión en nuestro repositorio cada vez que se completa la compilación y la versión nr se ha modificado.
Si ahora corro
docker-compose pull && docker-compose -f docker-compose.yml up -d
en una carpeta en mi computadora, donde el contenido es solo el docker-compose.yml y los Dockerfiles necesarios para construir los servicios nginx y php, el resultado que obtengo no es el número de versión más reciente como se ha etiquetado en el registro o se muestra en docker-compose.yml (0.1.8), pero la versión anterior, que es 0.1.7. Sin embargo, el resultado del comando de extracción sugeriría que se obtuvo una nueva versión de la imagen:
Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev
Solo si corro
docker-compose stop && docker-compose rm -f
y luego ejecuto el docker-compose up
comando para que la nueva versión aparezca en la pantalla como se esperaba.
¿Es este comportamiento previsto de docker-compose? es decir, ¿debería hacer siempre una docker-compose rm -f
antes de ejecutar de up
nuevo, incluso en servidores de producción? ¿O estoy haciendo algo en contra de la corriente aquí, por eso no está funcionando?
El objetivo es que nuestro proceso de compilación compile y cree versiones etiquetadas de las imágenes necesarias en un docker-compose.yml, las envíe a nuestro registro privado y luego, para el "paso de lanzamiento a producción", simplemente copie el docker-compose. yml al servidor de producción y ejecute a docker-compose pull && docker-compose -f docker-compose.yml up -d
para que la nueva imagen comience en producción. Si alguien tiene consejos sobre esto o puede señalar un tutorial de mejores prácticas para este tipo de configuración, también sería muy apreciado.
fuente
docker-compose up -d --force-recreate
no funcionó?--force-recreate
no está recreando los contenedores, es posible que deba presentar un informe de error endocker-compose
. Tenga en cuenta que usar una nueva imagen sería recrear el contenedor, lo que lo eliminaría. Y si no elimina ningún volumen específico del contenedor en el proceso, puede obtener una lista bastante larga de datos que nunca volverá a usardocker volume ls -f dangling=true
. Entonces, su solución es la primera mitad de lo que Docker-compose debería hacer por usted.Respuestas:
Para asegurarse de que está utilizando la última versión para su
:latest
etiqueta de su registro (por ejemplo, Docker Hub), también debe extraer la última etiqueta nuevamente. en caso de que cambie, el diff se descargará y se iniciará cuandodocker-compose up
vuelva a hacerlo .así que este sería el camino a seguir:
pegué esto en una imagen que ejecuto para iniciar la composición de docker y asegurarme de que las imágenes se mantengan actualizadas: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/
fuente
docker-compose pull && docker-compose up -d
es suficiente. Verifica automáticamente si los contenedores en ejecución están desactualizados y, si ese es el caso, los recrea con las imágenes más recientesPara obtener las imágenes más recientes, use docker-compose build --pull
Utilizo el siguiente comando que es realmente 3 en 1
docker-compose down && docker-compose build --pull && docker-compose up -d
Este comando detendrá los servicios, extrae la última imagen y luego inicia los servicios.
fuente
docker-compose pull
para actualizar imágenes para servicios con image: en lugar de build: indocker-compose.yml
o ¿docker-compose build --pull
hará esto?nginx uses an image, skipping
cuando uso docker-compose build --pull Por lo tanto, no se actualizan las imágenes.Para cerrar esta pregunta, lo que parecía haber funcionado es efectivamente
Es decir, retire los contenedores antes de ejecutar de
up
nuevo.Lo que hay que tener en cuenta al hacerlo así es que los contenedores de volumen de datos también se eliminan si se ejecuta
rm -f
. Para evitar que especifique explícitamente cada contenedor para eliminar:Como dije en mi pregunta, no sé si este es el proceso correcto. Pero esto parece funcionar para nuestro caso de uso, así que hasta que encontremos una mejor solución, seguiremos con esta.
fuente
He visto que esto ocurre en nuestro sistema de producción de Docker 7-8. Otra solución que funcionó para mí en producción fue ejecutar
esto elimina los contenedores y parece hacer 'up' para crear nuevos a partir de la última imagen.
Esto todavía no resuelve mi sueño de bajar + subir por CADA contenedor cambiado (en serie, menos tiempo de inactividad), pero funciona para forzar 'arriba' para actualizar los contenedores.
fuente
docker-compose down
afaik también elimina cualquier contenedor de volumen de datos vinculado a los contenedores en ejecución. Entonces, no hay problema si los volúmenes de datos solo contienen cosas que se pueden volver a crear desde un contenedor en ejecución. Pero debe tener cuidado si los volúmenes contienen datos que desea conservar.down
elimina, por defecto y el documento actual: contenedores, redes y redes por defecto. Doc dice "Las redes y los volúmenes definidos como externos nunca se eliminan". Funciona para mí con volúmenes con nombre (y supongo que eso también es cierto para las redes con nombre).Opción
down
resolver este problemaEjecuto mi archivo de redacción:
docker-compose -f docker/docker-compose.yml up -d
luego borro todo con
down --rmi all
docker-compose -f docker/docker-compose.yml down --rmi all
fuente
Pasé medio día con este problema. La razón fue que asegúrese de verificar dónde se registró el volumen.
Pero el caso es que en este lugar estaba el código que cambiamos. Pero al actualizar la ventana acoplable, el código no cambió.
Por lo tanto, si está verificando el código de otra persona y por alguna razón no está actualizando, verifique esto.
Y así, en general, este enfoque funciona:
fuente
La documentación de docker-compose para el comando 'up' establece claramente que actualiza el contenedor en caso de que se cambie la imagen desde que se realizó el último 'up':
Entonces, al usar 'detener' seguido de 'tirar' y luego 'subir', esto debería evitar problemas de pérdida de volúmenes para los contenedores en ejecución, excepto, por supuesto, para los contenedores cuyas imágenes se han actualizado.
Actualmente estoy experimentando con este proceso e incluiré mis resultados en este comentario en breve.
fuente
Si la configuración de composición de la ventana acoplable está en un archivo, simplemente ejecute:
fuente
Pero
no trabajo ?
fuente
Estoy usando el siguiente comando para obtener las últimas imágenes
sudo docker-compose down -rmi all
sudo docker-compose up -d
fuente