假设我们有一个由 .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
的扩展名,它声明了名为 one
和 two
的 secret 。它有一个名为 secrets
的 anchor ,用于填充服务 a
和 b
的公共(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.yml
和 bar.yml
中的 secret 列表已合并在一起。
顺便说一句,您可以使用名为 COMPOSE_FILE
的环境变量指定 Compose 文件列表,该变量也可以放置在名为 .env
的文件中。 .
关于docker - 有没有办法将 docker-compose 中的扩展字段与 docker secret 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560656/