假设我们有一个由.yml文件配置的docker堆栈,其中包含3个服务- a,b和c。此外,还有一堆这些服务使用的秘密。两个用于数据库,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正如您所看到的,一些秘密在每个服务中重复。docker-compose文件有“扩展字段”这样的东西-- https://docs.docker.com/compose/compose-file/#extension-fields有没有办法使用这个扩展字段来避免重复的秘密?如下所示:
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+的答案。
发布于 2019-02-07 04:15:14
不能使用YAML锚点和别名将列表项组合到单个平面列表中。但是,docker-compose有自己的合成文件的深度合并过程,您可以将其与YAML锚点和别名相结合,以获得您正在寻找的效果。为此,您需要将服务定义拆分为两个文件。下面是一个例子
foo.yml
这个合成文件有一个名为x-secrets的扩展名,它声明了名为one和two的秘密。它有一个名为secrets的锚点,并用它来填充服务a和b的公共秘密。
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: truebar.yml
接下来,这个组合文件使用两个额外的秘密扩展了服务a,分别名为three和four。
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现在有四个秘密。来自foo.yml和bar.yml的秘密列表已合并在一起。
另外,您可以使用名为COMPOSE_FILE的环境变量指定合成文件的列表,该环境变量也可以放在名为.env的文件中。
https://stackoverflow.com/questions/54560656
复制相似问题