Estoy usando docker compose versión 3.3 y quiero usar la variable de entorno para definir el nombre del volumen. Miré una pregunta relacionada, pero parece ser bastante viejo. Con la sintaxis larga admitida en 3.2, ¿hay alguna manera de lograrlo? Esto es lo que probé en mi archivo de composición de Docker:

version: '3.3'
services:
  target:
    image: "my-registry/my-image:${IMAGE_TAG}"
    volumes:
        - type: volume
          source: ${VOLUME_NAME}
          target: /data
    ports:
     - "${TOMCAT_PORT}:8080"

volumes:
  ${VOLUME_NAME}:

Obviamente, esta sintaxis no funciona ya que el nombre del volumen no se sustituye en las claves y arroja el siguiente error:

valor de volúmenes No se permiten propiedades adicionales ('$ {VOLUME_NAME}' fue inesperado)

Cualquier ayuda será muy apreciada.

6
Aarkan 14 jul. 2017 a las 16:07

2 respuestas

La mejor respuesta

Este es el comportamiento esperado: Compose solo hace interpolación de variables en valores, no en claves. Consulte aquí.

En mi proyecto utilizo estructura externa:

version: '3.1'
services:
### Code from branch develop ###
  applications:
    image: registry.gitlab.lc:5000/develop/ed/develop.sources:latest
    volumes:
      - developcode:/var/www/develop
    deploy:
      replicas: 1
      update_config:
        parallelism: 1
        delay: 5s
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]
### PHP-FPM ###
  php-fpm:
    image: registry.gitlab.lc:5000/develop/ed/php-fpm-ed-sq:latest
    volumes:
      - developcode:/var/www/develop
    expose:
      - "9000"
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 5s
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]
    logging:
      driver: gelf
      options:
        gelf-address: "udp://${GRAYLOG_ADDR}:12201"
        tag: "php-fpm"
### Nginx ###
  nginx:
    image: registry.gitlab.lc:5000/develop/ed/nginx-ed-sq:staging
    volumes:
      - developcode:/var/www/develop
    ports:
      - "80:80"
      - "443:443"
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 5s
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]
### Volumes Setup ###
volumes:
  developcode:
    external:
      name: code-${VER}

Pero antes que nada necesito crear un volumen externo manualmente, e. gramo.:

export VER=1.1 && docker volume create --name code-$VER

Puedes ver el volumen creado:

docker volume ls
DRIVER              VOLUME NAME
local               code-1.0
local               code-1.1

Y después de eso, implemente los servicios usando:

env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy --with-registry-auth --compose-file docker-compose.yml MY_STACK
6
Yevhen Lebid 14 ago. 2017 a las 12:24

Si necesita cambiar cosas complejas entre entornos, como usar configuraciones de volumen completamente diferentes, debe anular su configuración con varios archivos de composición acoplable.

Las variables de entorno deben usarse solo para valores simples.

El uso de varios archivos de configuración le permite definir un archivo docker-compose.yml predeterminado con su configuración base y otro docker-compose.override.yml para los cambios que necesita para un entorno en particular.

Luego, al crear los servicios, docker compose fusionará los archivos de configuración.

En su caso, su configuración predeterminada podría verse así:

# docker-compose.yml
version: '3.3'
services:
  target:
    image: "my-registry/my-image:${IMAGE_TAG}"
    volumes:
        - type: volume
          source: vprod
          target: /data
    ports:
     - "80:8080"

volumes:
  vprod:

Y su archivo de anulación de desarrollo puede verse así:

# docker-compose.override.yml
services:
  target:
    volumes:
        - source: vdev
          target: /data
    ports:
     - "8080:8080"

volumes:
  vdev:

Tenga en cuenta que no es necesario repetir todos los servicios ni todas las claves en el archivo de anulación.

Cuando ejecute docker-compose up, ambas configuraciones se fusionarán y el archivo de anulación tendrá prioridad.

Docker compose recoge docker-compose.yml y docker-compose.override.yml de forma predeterminada, si tiene más archivos o archivos con diferentes nombres, debe especificarlos en orden:

docker-compose -f docker-compose.yml -f docker-compose.custon.yml -f docker-compose.dev.yml up -d
0
Jens 1 may. 2020 a las 02:50