Usando la función de campos de extensión de Docker Compose 3.4, ¿es posible combinar un conjunto común de variables de entorno en forma de matriz (o cualquier matriz) con declaraciones específicas del servicio? La documentación no está clara en cuanto a si esto es compatible.
Llamar docker-compose up en el siguiente YAML da como resultado el restart , el punto de entrypoint y los volumes que se configuran en my-service , pero parece reemplazar la declaración de environment que proviene del campo de extensión con la declaración que existe en my-service . Me gustaría que se fusionaran.
version: '3.4' x-service-config: &service-config restart: "on-failure" entrypoint: "" volumes: - "~/.aws:/home/serviceuser/.aws" environment: - "CommonVar1=foo" - "CommonVar2=bar" services: my-service: <<: *service-config image: my-service:latest environment: - "ServiceVar1=baz"La fusión solo ocurre en el nivel superior. Si desea fusionar una clave en un nivel inferior, use una plantilla separada.
Recreé el problema usando el siguiente archivo de redacción. Utiliza una imagen pública y ejecuta el comando env para que uno pueda seguirlo fácilmente sin dependencias externas.
Aquí hay un docker-compose.yml que funciona de forma independiente, que muestra cómo se fusiona el 'entorno':
version: '3.4' x-service-config: &ref restart: 'on-failure' environment: &env 'foo': 'bar' 'bing': 'baz' services: bop: image: 'alpine' command: 'env' <<: *refAquí está el resultado, que muestra que la clave de 'entorno' del ancla se está copiando:
$ docker-compose up Creating network "merge_default" with the default driver Creating merge_bop_1 ... done Attaching to merge_bop_1 bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bop_1 | HOSTNAME=d4122a655e1d bop_1 | foo=bar bop_1 | bing=baz bop_1 | HOME=/root merge_bop_1 exited with code 0Aquí está el mismo archivo de redacción, pero con 'entorno' anulado en la definición de servicio 'bop':
version: '3.4' x-service-config: &ref restart: 'on-failure' environment: &env 'foo': 'bar' 'bing': 'baz' services: bop: image: 'alpine' command: 'env' environment: 'bat': 'far' <<: *ref y la salida correspondiente, mostrando solo bat=far y no las otras variables:
$ docker-compose up Creating network "merge_default" with the default driver Creating merge_bop_1 ... done Attaching to merge_bop_1 bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bop_1 | HOSTNAME=efe76cb7e09d bop_1 | bat=far bop_1 | HOME=/root merge_bop_1 exited with code 0La solución es dividir esto en dos plantillas/anclajes de la siguiente manera:
version: '3.4' x-service-config: &ref restart: 'on-failure' x-environment-config: &env 'foo': 'bar' 'bing': 'baz' services: bop: image: 'alpine' command: 'env' environment: <<: *env 'true': 'false' <<: *refy aquí está el resultado que muestra los valores combinados:
$ docker-compose up Creating network "merge_default" with the default driver Creating merge_bop_1 ... done Attaching to merge_bop_1 bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bop_1 | HOSTNAME=617f90a94a7d bop_1 | foo=bar bop_1 | bing=baz bop_1 | true=false bop_1 | HOME=/root merge_bop_1 exited with code 0Esto funciona porque está fusionando las dos claves que desea fusionar.