docker-compose 文件中哪些地方允许使用 Go 模板?

Where are Go templates allowed in docker-compose files?

标题不言自明:我找不到描述在撰写文件中允许使用 Go 模板的位置的文档。

换句话说,我想知道支持以下哪项:

version: "3.7"


services:
  whoami:
    image: "containous/whoami"
    environment:
      - VALUE='{{.Name}}'
      - NAME_{{.Name}}='NAME'
    deploy:
      labels:
        - value={{.Name}}
        - name_{{.Name}}=NAME
    networks:
      - {{.Name}}

Go 模板是 Go 标准库的一部分。 docker-compose 是一个单独的应用程序,作为 docker 的一部分。

1.声明您的模板。

您可以在 Go 代码中将模板声明为 const,或者将其放在文件中。

const composeTemplate = `version: "3.7"

services:
  whoami:
    image: "containous/whoami"
    environment:
      - VALUE='{{.Name}}'
      - NAME_{{.Name}}='NAME'
    deploy:
      labels:
        - value={{.Name}}
        - name_{{.Name}}=NAME
    networks:
      - {{.Name}}
`

2。为您的模板配置。

创建将填充并用于执行模板的配置类型。

type Config struct {
    Name string
}

3。使用 config.

执行您的模板
conf := &Config{Name: "MyService"}

tpl, err := template.New("myservice").Parse(composeTemplate)
if err != nil {
    // Handle error.
}

var output bytes.Buffer
err = tpl.Execute(&output, conf)
if err != nil {
    // Handle error.
}

4.将输出写入文件。

err = ioutil.WriteFile("myservice-compose.yml", output.Bytes(), 0644)
if err != nil {
    // Handle error.
}

(Go Playground)

祝你好运!

我一直在搜索,显然 official Docker documentation 中实际上提供了信息,即使它没有明确引用 docker 撰写文件格式。

特别是:

You can use templates for some flags of service create, using the syntax provided by the Go’s text/template package.

The supported flags are the following :

--hostname --mount --env

由于未列出 --labels,我们应该假设 text/template 不允许替换。

我很好奇“文档在哪里?”就此而言,是的,它几乎可以正常工作。 docker-compose 是另一个解析 yaml 文件以提供 docker 客户端接口以向 docker 守护程序发送命令的应用程序,或者至少这是我的理解,因为它看起来像 golang 模板通过通过并被替换。

这是一个使用示例 https://github.com/lovelysystems/rabbitmq-swarm-cluster/blob/master/docker-compose.yml

更多相关信息: https://github.com/moby/moby/issues/37377

我认为打开一个新案例是个好主意,但谁维护 docker.com 文档?