gpt4 book ai didi

docker - 有什么方法可以在docker-compose中使用docker secrets使用扩展字段?

转载 作者:行者123 更新时间:2023-12-02 18:36:52 35 4
gpt4 key购买 nike

假设我们有一个由.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 ,例如,将在新旧服务中使用,因此该解决方案必须灵活。找到答案我将不胜感激。我正在寻找答案,以查找任何撰写版3.4+。

最佳答案

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

foo.yml

该Compose文件具有名为x-secrets的扩展名,该扩展名声明名为onetwo的 secret 。它有一个名为secrets的 anchor ,并用于填充服务ab的常见 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文件用两个额外的 secret 扩展了服务 a,它们分别是 threefour
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 secrets使用扩展字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560656/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com