首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在docker-compose中使用扩展字段和docker密钥?

有没有办法在docker-compose中使用扩展字段和docker密钥?
EN

Stack Overflow用户
提问于 2019-02-07 02:52:47
回答 1查看 2.6K关注 0票数 2

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

代码语言:javascript
复制
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

正如您所看到的,一些秘密在每个服务中重复。docker-compose文件有“扩展字段”这样的东西-- https://docs.docker.com/compose/compose-file/#extension-fields有没有办法使用这个扩展字段来避免重复的秘密?如下所示:

代码语言:javascript
复制
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。和“秘密”部分需要列表。有没有人知道如何正确处理它?请注意,将来可能会添加新的秘密,例如,将在新旧服务中使用,因此解决方案必须是灵活的。如果能找到答案,我将不胜感激。我正在搜索任何组合版本的3.4+的答案。

EN

回答 1

Stack Overflow用户

发布于 2019-02-07 04:15:14

不能使用YAML锚点和别名将列表项组合到单个平面列表中。但是,docker-compose有自己的合成文件的深度合并过程,您可以将其与YAML锚点和别名相结合,以获得您正在寻找的效果。为此,您需要将服务定义拆分为两个文件。下面是一个例子

foo.yml

这个合成文件有一个名为x-secrets的扩展名,它声明了名为onetwo的秘密。它有一个名为secrets的锚点,并用它来填充服务ab的公共秘密。

代码语言:javascript
复制
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

接下来,这个组合文件使用两个额外的秘密扩展了服务a,分别名为threefour

代码语言:javascript
复制
version: "3.7"

services:
  a:
    secrets:
      - three
      - four

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

组合合成文件

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

代码语言:javascript
复制
$ 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现在有四个秘密。来自foo.ymlbar.yml的秘密列表已合并在一起。

另外,您可以使用名为COMPOSE_FILE的环境变量指定合成文件的列表,该环境变量也可以放在名为.env的文件中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54560656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档