在docker compose中使用卷名称的环境变量

时间:2017-07-14 13:07:53

标签: docker-compose

我正在使用docker compose版本3.3并希望使用环境变量来定义卷名。我查看了一个相关的question,但这似乎很老了。 3.2中支持长语法,有没有办法实现这一点? 这是我在docker compose文件中尝试的内容:

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}:

显然这个语法不起作用,因为密钥中没有替换卷名并引发以下错误:

  

volume value不允许使用其他属性(' $ {VOLUME_NAME}'   出人意料)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

这是预期的行为 - Compose只在值中进行变量插值,而不是键。请参阅here

在我的项目中,我使用external structure

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}

但首先我需要手动创建外部卷,例如: G:

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

您可以看到创建的音量:

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

然后,使用以下方式部署服务:

env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy --with-registry-auth --compose-file docker-compose.yml MY_STACK

答案 1 :(得分:2)

如果您需要在环境之间更改复杂的内容,例如使用完全不同的音量设置,则应使用multiple docker-compose files 覆盖配置

环境变量应仅用于简单值。

使用多个配置文件,您可以使用基本配置定义默认的docker-compose.yml文件,并为特定环境所需的更改定义另一个docker-compose.override.yml

然后,在创建服务时,docker compose将合并配置文件。

在您的情况下,您的默认配置可能如下所示:

# 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:

您的开发替代文件可能如下所示:

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

volumes:
  vdev:

请注意,并非所有服务和所有键都需要在覆盖文件中重复。

运行docker-compose up时,两种配置都将与优先文件合并。

默认情况下,Docker compose会拾取docker-compose.ymldocker-compose.override.yml,如果您有更多文件或具有不同名称的文件,则需要按顺序指定它们:

docker-compose -f docker-compose.yml -f docker-compose.custon.yml -f docker-compose.dev.yml up -d

答案 2 :(得分:0)

如果你想避免不同项目之间的冲突,你只需要为docker-compose指定--project-name "your_project_name"。它为所有服务和卷添加了命名空间。

例如,您可以为几个项目使用相同的 docker-compose.yml

volumes:
    dbdata_mysql:

services:
    mysql_db:
        image: mysql:5.7
        volumes:
            - "dbdata_mysql:/var/lib/mysql"

如果你开始你的项目:

docker-compose --project-name "first_project" up -d
docker-compose --project-name "second_project" up -d

它将创建命名空间卷:

$ docker volume ls | grep dbdata_mysql

local     first_project_dbdata_mysql
local     second_project_dbdata_mysql