在Dockerize Golang模板中从文件内容设置变量

时间:2018-12-24 12:14:35

标签: go

我想使用dockerize中的jsonQuery语法来解析traefik的acme.json并为另一个服务中的TLS设置发出证书/密钥文件。

jsonQuery接受一个字符串,该字符串作为示例提供为环境变量{{ .Env.myJson }}

如何获取文件的字符串内容:

{{with $myJsonContent := <insert magic here> }}
    # extract key to file 
{{end}}

2 个答案:

答案 0 :(得分:1)

Go的text/template本身不支持。它是looks like的dockerize工具provides a couple of extension functions,但它们都不允许。

(我能想到的最近一点是支持reading a file from a Helm chart,但这是在Go级别通过注入一个特殊的访问器对象实现的,该对象可以为模板代码提供文件访问API,并且故意限制为物理上位于Helm图表目录中的文件。)

答案 1 :(得分:0)

我看不到任何向模板添加功能的方法,因为dockerize在解析之前不会向模板公开添加功能。因此,您要么(1)将acme.json的内容放入环境变量中,要么(2)修改dockerize在模板中包含jsonFileQuery函数。

  1. 在运行dockerize之前将acme.json的内容添加到环境变量中-然后如示例中所示进行访问。这可以通过一个小的go程序来完成,将其添加到容器中并在CMD dockerize之前通过CMD运行

  2. 叉化和更改jsonQuery :叉化和更改line 83 of template.go
    来自:parser, err := gojq.NewStringQuery(jsonObj)
    到:parser, err := gojq.NewFileQuery(jsonObj)
    然后使用:

    {{with $myJsonContent := jsonQuery "/opt/traefik/acme.json" "toplevelobject"  }}
        # extract key to file 
    {{end}}
    

    gojq.NewStringQuery()是jsonQuery模板函数的函数。 gojq.NewFileQuery()版本具有与StringQuery相同的签名,但是在输入字符串的路径中读取文件,而不是将输入字符串用作json。

    OR

    将新的jsonFileQuery模板函数合并到dockerize 中:向dockerize提交一个问题,以将jsonFileQuery添加到模板函数中。似乎可以将其设置为与jsonQuery相同,但是上面的差别很小。在template.go中,添加jsonFileQuery函数,并将其分配给generateFile()中template.FuncMap {}中的jsonFileQuery。