在 docker compose 中使用环境变量作为卷名

Aar*_*kan 15 docker-compose

我正在使用 docker compose 3.3 版并想使用环境变量来定义卷名称。我看了一个相关的问题,但这似乎已经很老了。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}:
Run Code Online (Sandbox Code Playgroud)

显然,此语法不起作用,因为卷名未在键中替换并引发以下错误:

卷值不允许附加属性(“${VOLUME_NAME}”是意外的)

任何帮助都感激不尽。

ISt*_*ger 25

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

例如,您可以docker-compose.yml在几个项目中使用相同的方法:

volumes:
    dbdata_mysql:

services:
    mysql_db:
        image: mysql:5.7
        volumes:
            - "dbdata_mysql:/var/lib/mysql"
Run Code Online (Sandbox Code Playgroud)

如果你开始你的项目:

docker-compose --project-name "first_project" up -d
docker-compose --project-name "second_project" up -d
Run Code Online (Sandbox Code Playgroud)

它将创建命名空间卷:

$ docker volume ls | grep dbdata_mysql

local     first_project_dbdata_mysql
local     second_project_dbdata_mysql
Run Code Online (Sandbox Code Playgroud)

  • 这就是答案!请投票 (4认同)

小智 12

这是预期的行为 - Compose 只对值进行变量插值,而不是键。见这里

在我的项目中,我使用外部结构

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}
Run Code Online (Sandbox Code Playgroud)

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

export VER=1.1 && docker volume create --name code-$VER
Run Code Online (Sandbox Code Playgroud)

您可以看到创建的卷:

docker volume ls
DRIVER              VOLUME NAME
local               code-1.0
local               code-1.1
Run Code Online (Sandbox Code Playgroud)

之后,使用以下方法部署服务:

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

  • 请注意,在较新的[版本](https://docs.docker.com/compose/compose-file/compose-file-v2/#external)中:“‘external.name’属性已被弃用,只需使用‘名称`属性。” (3认同)

Rub*_*min 9

这就是我在 .env 中完成案例的方法

# To use a code volume create the volume mapping an existing folder like this and pass the value of <volume_name> below
# docker volume create --driver local --opt type=none --opt device=<full_path_to_folder> --opt o=bind <volume_name>
PROJECT_VOLUME_CODE=myproject_code
Run Code Online (Sandbox Code Playgroud)

然后在 docker-compose.yml (版本 3.7)或更高版本的服务内

    volumes:
      - type: volume
        source: code
        target: /var/www/html
Run Code Online (Sandbox Code Playgroud)

外部

volumes:
  code:
    external: true
    name: ${PROJECT_VOLUME_CODE}
Run Code Online (Sandbox Code Playgroud)


iqu*_*ito 5

我设法通过以下语法使用环境变量:

volumes:
    - "$HOME/.cache/composer:/tmp/composer_cache"
Run Code Online (Sandbox Code Playgroud)