docker - 有没有办法将 docker-compose 中的扩展字段与 docker secret 一起使用?

标签 docker docker-compose yaml devops docker-swarm

假设我们有一个由 .yml 文件配置的 docker 堆栈,其中包含 3 个服务 - a、b 和 c。此外,这些服务还使用大量 secret 。两个用于数据库、Azure 服务,每个服务都有一些唯一的。因此,我们的 .yml 文件如下所示:

version: '3.4'

services:
 a:
  image: a-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -azure.secret_key
   -azure.public_key
   -a.secret_key1
   -a.secret_key2
 b:
  image: b-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -b.secret_key1
   -b.secret_key2
 c:
  image: c-image
  [...]
  secrets:
   -db.pwd
   -db.user
   -azure.secret_key
   -azure.public_key
   -c.secret_key1
   -c.secret_key2

secrets:
 db.pwd:
  external: true
 db.user:
  external: true
 azure.secret_key:
  external: true
 azure.public_key:
  external: true
 a.secret_key1:
  external: true
 a.secret_key2:
  external: true
 b.secret_key1:
  external: true
 b.secret_key2:
  external: true
 c.secret_key1:
  external: true
 c.secret_key2:
  external: true

正如您所看到的,每个服务中都会重复一些 secret 。 docker-compose 文件具有“扩展字段”之类的内容 - https://docs.docker.com/compose/compose-file/#extension-fields 有什么方法可以使用此扩展字段来避免重复 secret 吗? 像这样的事情:

version: '3.4'
x-common-db-secrets: &db-secrets
 - db.user
 - db.pwd

x-common-azure-secrets: &azure-secrets
 - azure.public_key
 - azure.secret_key

services:
 a:
  image: a-image
  [...]
  secrets:
   <<: *db-secrets
   <<: *azure-secrets
   -a.secret_key1
   -a.secret_key2
 b:
  image: b-image
  [...]
  secrets:
   <<: *db-secrets
   -b.secret_key1
   -b.secret_key2
 c:
  image: c-image
  [...]
  secrets:
   <<: *db-secrets
   <<: *azure-secrets
   -c.secret_key1
   -c.secret_key2

secrets:
 [...]

我正在使用此扩展字段来共享环境变量。但解析扩展字段所需的结构是map。 “ secret ”部分需要列表。有谁知道如何正确处理它?请注意,将来可能会添加新的 secret ,例如将在旧服务和新服务中使用,因此解决方案必须灵活。如果能找到答案,我将不胜感激。正在寻找任何 compose 版本 3.4+ 的答案。

最佳答案

无法使用 YAML anchor 和别名将列表项组合到单个平面列表中。但是,docker-compose 有自己的 Compose 文件深度合并过程,您可以将其与 YAML anchor 和别名结合起来以获得您想要的效果。为此,您需要将服务定义拆分为两个文件。这是一个例子

foo.yml

此 Compose 文件具有名为 x-secrets 的扩展名,它声明了名为 onetwo 的 secret 。它有一个名为 secrets 的 anchor ,用于填充服务 ab 的公共(public) secret 。

version: "3.7"

x-secrets: &secrets
  secrets:
    - one
    - two

services:
  a:
    <<: *secrets
    image: a-image

  b:
    <<: *secrets
    image: b-image

secrets:
  one:
    external: true
  two:
    external: true

bar.yml

接下来,此 Compose 文件使用两个额外的 key 扩展服务 a,名为

version: "3.7"

services:
  a:
    secrets:
      - three
      - four

secrets:
  three:
    external: true
  four:
    external: true

组合撰写文件

这两个文件就位后,告诉 docker-compose 将它们用于项目配置。这些文件将按顺序合并以形成一个完整的配置。我使用 config 命令来显示最终配置。

$ docker-compose -f foo.yml -f bar.yml config
secrets:
  four:
    external: true
    name: four
  one:
    external: true
    name: one
  three:
    external: true
    name: three
  two:
    external: true
    name: two
services:
  a:
    image: a-image
    secrets:
    - source: four
    - source: one
    - source: three
    - source: two
  b:
    image: b-image
    secrets:
    - source: one
    - source: two
version: '3.7'

在这里,您可以看到服务a现在有四个 secret 。 foo.ymlbar.yml 中的 secret 列表已合并在一起。

顺便说一句,您可以使用名为 COMPOSE_FILE 的环境变量指定 Compose 文件列表,该变量也可以放置在名为 .env 的文件中。 .

关于docker - 有没有办法将 docker-compose 中的扩展字段与 docker secret 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560656/

相关文章:

amazon-web-services - 如何使用 Dockerized SAM Local 设置调试

neo4j - 无法在 Docker Swarm 中发现其他 Neo4J 因果集群实例

docker - 谁负责健康检查?撰写还是容器本身?

npm - JavaScript (npm) 中的 Yaml/Swagger lint 和验证器

Docker 1.12.1 : after swarm init, worker 无法加入 swarm

docker - 创建 dockerfile 时遵循符号链接(symbolic link)

docker - Docker Pull在断开连接的环境中失败

ruby-on-rails - Dockernized Nginx +(Rails + Unicorn)+ Redis + PostgreSQL:connect()失败(111:连接被拒绝)

python - 如何在 block 中的新行之后开始列出键

go - 如何扩展 go-yaml 以支持自定义标签