docker - docker compose 有没有办法创建交叉服务常量?

标签 docker variables duplicates docker-compose code-duplication

我有这样的撰写文件:

service1:
   //some stuff
   environment:
  - "PROP=some_common_value"
service2:
  //some stuff
  environment:
  - "PROP=some_common_value"
service2:
  //some stuff
  environment:
  - "PROP=some_common_value"

我想设置具有相同值的属性。

我现在可以复制该值。看起来很糟糕。
docker compose 中有没有办法创建跨服务常量?

最佳答案

有几个选项。如果您使用 docker-compose 而不是 docker stack deploy 进行部署,那么您可以使用 .env 文件来设置变量。或者使用 docker-compose 或 swarm 模式,您可以在 shell 中设置环境变量(通常是用于部署应用程序的 shell 脚本)。在 yaml 内部,您可以使用如下环境变量:

service1:
  environment:
  - PROP
service2:
  environment:
  - PROP
service2:
  environment:
  - PROP

或显式使用如下变量:

service1:
  environment:
  - PROP=${PROP}
service2:
  environment:
  - PROP=${PROP}
service3:
  environment:
  - PROP=${PROP}

如果您有一个 .env 文件并且想要执行 docker stack deploy,您可以使用以下任一脚本处理该文件:

# option 1, leaves vars set in shell
set -a && . .env && set +a && docker stack deploy -c compose.yml stack_name

# option 2, only sets vars for single command
env $(cat .env | xargs) docker stack deploy -c compose.yml stack_name

在上述每一项中,.env 只是您可以在 shell 中设置的变量:

PROP=some_common_value

下一个选项是使用 anchor 和别名的 Yaml 语法。这从 Yaml 文件的一个部分复制到另一个部分(为了支持在 service3 中合并,我切换到键/值而不是数组语法):

service1:
  environment: &common_env
    PROP: "some_common_value"
service2:
  environment: *common_env
service3:
  environment:
    <<: *common_env
    PROP3: "unique value"

为了让每个服务都有唯一的值,Docker 添加了 extension fields在 compose 语法的最新版本中。这使您可以定义与任何服务定义分开的 anchor 并将其合并到每个服务中,每个服务都有自己的唯一值,例如:

version: '3.4'
x-common-env: &common_env
  PROP: "some_common_value"
services:
  service1:
    environment:
      <<: *common_env
      PROP1: "unique value 1"
  service2:
    environment:
      <<: *common_env
      PROP2: "unique value 2"
  service3:
    environment:
      <<: *common_env
      PROP3: "unique value 3"

关于docker - docker compose 有没有办法创建交叉服务常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52782099/

相关文章:

python - 在python控制台中显示中文字符

maven - docker maven 镜像的 Jenkins 管道脚本退出状态 -1

c++ - int x=1000 和只是 x=1000 产生不同的值

php - MySQL 插入行,重复 : add suffix and re-insert

python - 如何将矩阵的每一行复制 N 次 Numpy

mongodb - Windows Docker mongo 容器不适用于卷安装

postgresql - 如何在构建时在 Docker 镜像之间建立网络?

php - 在 PHP 中, "final static"和 "const"有什么区别?

java - 从其他类访问数据

random - 如何获得从1到N随机排序的数字数组?