tag library images imagenes hub dockers container docker build-process docker-compose

library - cómo obtener la función docker-compose para usar la última imagen del repositorio



dockers images (7)

No sé qué estoy haciendo mal, pero simplemente no puedo docker-compose up para usar la última imagen de nuestro registro sin primero eliminar por completo los contenedores viejos del sistema. Parece que componer está utilizando la imagen iniciada anteriormente, a pesar de que la función de composición de la ventana acoplable ha obtenido una imagen más nueva.

Miré ¿Cómo obtener una composición acoplable para volver a crear siempre contenedores a partir de imágenes nuevas? que parecía ser similar a mi problema, pero ninguna de las soluciones provistas allí funcionan para mí, ya que estoy buscando una solución que pueda usar en el servidor de producción y 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 modificadas, 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 compilación. La versión nr se muestra si navego al servidor nginx que se crea (esto funciona como se espera a nivel local).

versión de docker: 1.11.2 versión de docker-compose: 1.7.1 OS: probado tanto en CentOS 7 como en OS X 10.10 usando el 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 construir 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 recibo una nueva etiqueta de versión en nuestro repositorio cada vez que se completa la compilación y se ha superado la versión nº.

Si ahora corro

docker-compose pull && docker-compose -f docker-compose.yml up -d

en una carpeta de mi computadora, donde el contenido es solo el docker-compose.yml y los Dockerfiles necesarios para compilar 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 el docker-compose.yml (0.1.8), pero la versión anterior a eso, que es 0.1.7. Sin embargo, la salida del comando de extracción sugeriría que se recuperó 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 ejecute el comando docker-compose up ¿Obtengo la nueva versión para que aparezca en la pantalla como se esperaba?

¿Es este comportamiento intencionado de docker-compose? es decir, ¿debería hacer siempre un docker-compose rm -f antes up volver up ejecutarlo, incluso en servidores de producción? ¿O estoy haciendo algo contra el grano aquí, por eso no está funcionando?

El objetivo es hacer que nuestro proceso de compilación se construya y crear versiones etiquetadas de las imágenes necesarias en un docker-compose.yml, enviarlas a nuestro registro privado y luego a la "versión para producción" para simplemente copiar el componente de docker-compose. yml para el servidor de producción y ejecute un docker-compose pull && docker-compose -f docker-compose.yml up -d para que la nueva imagen comience en producción. Si alguien tiene sugerencias sobre esto o puede apuntar a un tutorial de mejores prácticas para este tipo de configuración, también sería muy apreciado.


He extendido un poco más el guión de Abhi como se muestra abajo.

export composeFile="docker-compose.test.yml" docker-compose -f $composeFile down docker-compose -f $composeFile pull docker-compose -f $composeFile up -d


He visto que esto ocurre en nuestro sistema de producción de ventanas acopladas 7-8. Otra solución que me funcionó en producción fue ejecutar.

docker-compose down docker-compose up -d

Esto quita los contenedores y parece que crea ''nuevos'' a partir de la última imagen.

Esto aún no resuelve mi sueño de abajo + arriba por CADA contenedor cambiado (en serie, menos tiempo de inactividad), pero funciona para forzar ''arriba'' para actualizar los contenedores.


La documentación de la ventana acoplable para el comando ''up'' indica claramente que actualiza el contenedor en caso de que la imagen se modifique desde la última ''arriba'':

Si existen contenedores para un servicio y la configuración o la imagen del servicio se modificaron después de la creación del contenedor, la función docker-compose recoge los cambios deteniendo y volviendo a crear los contenedores (conservando los volúmenes montados).

Por lo tanto, al usar ''detener'' seguido de ''tirar'' y luego ''subir'', esto debería evitar los problemas de volúmenes perdidos para los contenedores en ejecución, excepto, por supuesto, para los contenedores cuyas imágenes se hayan actualizado.

Actualmente estoy experimentando con este proceso e incluiré mis resultados en este comentario en breve.


Opción down resolver este problema

Ejecuto 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

Stops containers and removes containers, networks, volumes, and images created by `up`. By default, the only things removed are: - Containers for services defined in the Compose file - Networks defined in the `networks` section of the Compose file - The default network, if one is used Networks and volumes defined as `external` are never removed. Usage: down [options] Options: --rmi type Remove images. Type must be one of: ''all'': Remove all images used by any service. ''local'': Remove only images that don''t have a custom tag set by the `image` field. -v, --volumes Remove named volumes declared in the `volumes` section of the Compose file and anonymous volumes attached to containers. --remove-orphans Remove containers for services not defined in the Compose file


Para cerrar esta pregunta, lo que parecía haber funcionado es en efecto correr.

docker-compose stop docker-compose rm -f docker-compose -f docker-compose.yml up -d

Es decir, retire los contenedores antes de correr up nuevo.

Lo que hay que tener en cuenta al hacerlo de esta manera es que los contenedores de volumen de datos también se eliminan si solo ejecuta rm -f . Para evitar que especifique explícitamente cada contenedor a eliminar:

docker-compose rm -f application nginx php

Como dije en mi pregunta, no sé si este es el proceso correcto. Pero esto parece funcionar para nuestro caso de uso, por lo tanto, hasta que encontremos una solución mejor, continuaremos con esta.


Para obtener las imágenes más recientes, utilice la compilación docker-compose --pull

Yo uso 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, extraerá la última imagen y luego iniciará los servicios.


para asegurarse de que está utilizando la versión más reciente para su :latest etiqueta de su registro (por ejemplo, el concentrador de la ventana acoplable) también necesita volver a extraer la última etiqueta. en caso de que cambie, el diff se descargará y se iniciará cuando vuelva docker-compose up .

Así que este sería el camino a seguir:

docker-compose stop docker-compose rm -f docker-compose pull docker-compose up -d

pegué esto en una imagen que ejecuto para iniciar docker-compose y asegurarme de que las imágenes estén actualizadas: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/