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.
docker-compose up -d --force-recreate
no funcionó?