cómo obtener docker-compose para usar la imagen más reciente del repositorio


No se lo que estoy haciendo mal, pero simplemente no puedo hacer que docker-compose up use la última imagen de nuestro registro sin eliminar primero los contenedores antiguos del sistema por completo. Parece que compose está utilizando la imagen iniciada anteriormente, aunque docker-compose pull ha obtenido una imagen más reciente.

Miré ¿Cómo conseguir que docker-compose vuelva a crear siempre contenedores a partir de imágenes nuevas? que parecía ser similar a mi problema, pero ninguna de las soluciones proporcionadas hay trabajo 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 volver a iniciarlos (posible pérdida de datos?). Me gustaría que compose solo detectara la nueva versión de las imágenes cambiadas, las extraiga y luego reinicie 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 I vaya al servidor nginx que se crea (esto funciona como se espera localmente).

Versión de Docker: 1.11.2 docker-compose versión: 1.7.1 Sistema operativo: probado en CentOS 7 y OS X 10.10 utilizando 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 corro 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 ser, ya que recibo una nueva etiqueta de versión en nuestro repositorio cada vez que se completa la compilación y la versión nr ha sido golpeado.

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 la docker-compose.yml y los Dockerfiles necesarios para construir los servicios nginx y php, la salida que obtengo no es el último número de versión 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, la salida del comando pull sugeriría que una nueva versión de la imagen era se obtiene:

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 si consigo que la nueva versión aparezca en la pantalla como se esperaba.

¿Es este el comportamiento previsto de docker-compose? es decir, ¿debo hacer siempre un docker-compose rm -f antes de ejecutar up de nuevo, incluso en servidores de producción? ¿O estoy haciendo algo a contracorriente, por lo que no está funcionando?

El objetivo es que nuestro proceso de compilación construya y cree versiones etiquetadas de las imágenes necesarias en un docker-compose.yml, envíalos a nuestro registro privado y luego al "paso release to production" para simplemente copiar el docker-compose.yml al 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 consejos sobre esto o puede apuntar a un tutorial de mejores prácticas para este tipo de configuración que sería muy apreciado también.

Author: Community, 2016-06-07

7 answers

Para cerrar esta pregunta, lo que parecía haber funcionado está funcionando

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

Es decir, retire los contenedores antes de volver a ejecutar up.

Lo que uno debe 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 para eliminar:

docker-compose rm -f application nginx php

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

 11
Author: Jens Wegar,
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-06-30 07:31:59

Para asegurarse de que está utilizando la última versión para su etiqueta :latest de su registro (por ejemplo, docker hub), también debe extraer la última etiqueta de nuevo. en caso de que cambie, el diff se descargará y se iniciará cuando docker-compose up de nuevo.

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 ejecuté para iniciar docker-compose y asegurarme de que las imágenes se mantengan actualizadas: https://hub.docker.com/r/stephanlindauer/docker-compose-updater /

 10
Author: stephanlindauer,
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-14 15:18:41

Para obtener las últimas imágenes use docker-compose build pull 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, extraerá la última imagen y luego iniciará los servicios.

 8
Author: Abhishek Galoda,
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-09-01 09:05:35

He visto que esto ocurre en nuestro sistema de producción de docker 7-8. Otra solución que funcionó para mí en la producción fue ejecutar

docker-compose down
docker-compose up -d

Esto elimina los contenedores y parece hacer 'up' crear nuevos a partir de la última imagen.

Esto todavía no resuelve mi sueño de down+up por CADA contenedor cambiado (en serie, menos tiempo de inactividad), pero funciona para forzar 'up' para actualizar los contenedores.

 1
Author: Danku,
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-30 08:42:20

La documentación docker-compose para el comando 'up' indica claramente que actualiza el contenedor si la imagen se cambia desde que se realizó el último 'up':

Si hay contenedores existentes para un servicio, y la configuración o imagen del servicio se cambió después de la creación del contenedor, docker-compose up recoge los cambios deteniendo y recreando los contenedores (preservando los volúmenes montados).

Así que usando 'stop' seguido por lo tanto, mediante 'pull 'y luego' up ' esto debería evitar problemas de volúmenes perdidos 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.

 0
Author: Paul Pritchard,
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-08-31 15:14:22

He extendido un poco más el script de Abhi como se muestra a continuación

export composeFile="docker-compose.test.yml"
docker-compose -f  $composeFile down 
docker-compose -f  $composeFile pull 
docker-compose -f  $composeFile up -d
 0
Author: scorpio,
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
2018-06-21 15:16:08

Opción down resolver este problema

Corro mi archivo de redacción:

docker-compose -f docker/docker-compose.yml up -d

Entonces 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
 0
Author: Slavik Muz,
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
2018-06-26 12:38:43