从dockerize golang模板中的文件内容设置变量

从dockerize golang模板中的文件内容设置变量,go,kubernetes-helm,Go,Kubernetes Helm,我想使用中的jsonQuery语法来解析traefik的acme.json,并为另一个服务中的TLS设置发出证书/密钥文件 jsonQuery接受一个字符串,该字符串作为环境变量{{.Env.myJson}} 如何获取文件的字符串内容: {{with $myJsonContent := <insert magic here> }} # extract key to file {{end}} {{带$myJsonContent:=} #将密钥提取到文件 {{end} Go的

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

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

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

{{with $myJsonContent := <insert magic here> }}
    # extract key to file 
{{end}}
{{带$myJsonContent:=}
#将密钥提取到文件
{{end}
Go的本机不支持这一点。它支持dockerize工具,但它们都不允许这样做


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

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

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

  • Fork dockerize和change jsonQuery:Fork dockerize和change:
    from:
    解析器,err:=gojq.NewStringQuery(jsonObj)

    到:
    解析器,err:=gojq.NewFileQuery(jsonObj)

    然后使用:

    {{with $myJsonContent := jsonQuery "/opt/traefik/acme.json" "toplevelobject"  }}
        # extract key to file 
    {{end}}
    
    是jsonQuery模板函数后面的函数。该版本与StringQuery具有相同的签名,但在输入字符串的路径处读取文件,而不是将输入字符串用作json

    将新的jsonFileQuery模板函数合并到dockerize中:向dockerize提交一个问题,以将jsonFileQuery添加到模板函数中。看起来它可以像jsonQuery一样进行设置,但是上面的差别很小。在中,添加jsonFileQuery函数并将其分配给generateFile()中template.FuncMap{}中的jsonFileQuery


  • 感谢@blobdon,这是我的假设,但我很感谢在golang有经验的人为我确认了这一点,并感谢他们在实现选项上提供了非常有用的指导。dockerize看起来不再积极维护了。您认为您将采用哪种方法?目前,我可能只使用
    jq
    将证书属性从
    acme.json
    提取到crt/key/bundle中,并将它们装载到容器中。如果服务转向生产,我将根据您的上述想法制定选项1。干杯