我尝试启动一个logspout容器,并通过一个docker-compose文件设置日志格式(一个ENV变量)。不太困难,如果我用docker-compose up
启动它,一切都很好。但是,当我尝试使用docker swarm init
和docker stack deploy -c docker-compose.yml mystack
启动它时,出现错误:
守护程序的错误响应:rpc错误:代码= InvalidArgument desc =扩展环境失败:扩展环境“ RAW_FORMAT = {\” container \“:\” {{.Container.Name}} \“,\”标签\“:{{toJSON .Container.Config.Labels}},\” timestamp \“:\” {{.Time.Format \“ 2006-01-02T15:04:05Z07:00 \”}} \“, \“ source \”:\“ {{.Source}} \”,\“ message \”:{{toJSON .Data}}}“”:模板:扩展:1:未定义函数“ toJSON” < / p>
我认为我只有swarm而不是docker-compose有错误,因为我要传递给logspout的ENV变量是:
RAW_FORMAT:'{“ container”:“ {{.Container.Name}}”,“ labels”:{{toJSON .Container.Config.Labels}},“ timestamp”:“ {{.Time .Format“ 2006-01-02T15:04:05Z07:00”}}“,” source“:” {{.Source}}“,” message“:{{toJSON .Data}}}' < / p>
此ENV变量包含一个go模板。但是,在群体模式下,您可以create services using go-templates。因此,似乎swarm尝试(但失败了)解析我只想传递给logspout容器的ENV变量的值。
是否可以告诉swarm不要在RAW_FORMAT变量中解析go-template?
如果没有,是否还有其他方法可以将此变量设置为正确的值?
如果您想重现此问题,这是一个最小的docker-compose文件:
version: "3.3"
services:
logspout:
image: gliderlabs/logspout:latest
volumes:
- /etc/hostname:/etc/host_hostname:ro
- /var/run/docker.sock:/var/run/docker.sock
environment:
RAW_FORMAT: '{ "container" : "{{ .Container.Name }}", "labels": {{ toJSON .Container.Config.Labels }}, "timestamp": "{{ .Time.Format "2006-01-02T15:04:05Z07:00" }}", "source" : "{{ .Source }}", "message": {{ toJSON .Data }} }'
如果您在Windows上,则必须先执行$Env:COMPOSE_CONVERT_WINDOWS_PATHS=1
。
答案 0 :(得分:2)
在go模板中,可以使用{{
来转义{{"{{"}}
,因此您的yml文件应如下所示:
version: "3.3"
services:
logspout:
image: gliderlabs/logspout:latest
volumes:
- /etc/hostname:/etc/host_hostname:ro
- /var/run/docker.sock:/var/run/docker.sock
environment:
RAW_FORMAT: '{ "container" : "{{"{{"}} .Container.Name }}", "labels": {{"{{"}} toJSON .Container.Config.Labels }}, "timestamp": "{{"{{"}} .Time.Format "2006-01-02T15:04:05Z07:00" }}", "source" : "{{"{{"}} .Source }}", "message": {{"{{"}} toJSON .Data }} }'
答案 1 :(得分:0)
您可以通过{{`
字符串`}}
来弯曲
environment:
RAW_FORMAT: '{{`{ "container" : "{{ .Container.Name }}`}}", "labels": {{ toJSON .Container.Config.Labels }}, "timestamp": "{{ .Time.Format "2006-01-02T15:04:05Z07:00" }}", "source" : "{{ .Source }}", "message": {{ toJSON .Data }} }`}}'
另一个例子
LDAP_SEARCH_FILTER={{`(sAMAccountName={{username}})`}}