错误
我尝试启动一个 logspout 容器并通过 docker-compose 文件设置日志格式(ENV 变量)。不太难,如果我启动它docker-compose up
,一切正常。但是当我尝试用 docker 启动它时swarm init
and docker stack deploy -c docker-compose.yml mystack
,我收到错误:
来自守护进程的错误响应:rpc 错误:code = InvalidArgument desc = 扩展 env 失败:扩展 env "RAW_FORMAT={ \"container\" : \"{{ .Container.Name }}\", \"labels\": {{ toJSON .Container.Config.Labels }},\"时间戳\":\"{{ .Time.Format \"2006-01-02T15:04:05Z07:00\" }}\",\"源\": \“{{ .Source }}\”,\“消息\”:{{ toJSON .Data }} }”:模板:扩展:1:函数“toJSON”未定义
我的理解
我认为我只在 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 }}", "消息": {{ toJSON .Data }} }'
这个 ENV 变量包含一个 go 模板。但通过集群模式,您可以使用 go-template 创建服务 https://docs.docker.com/engine/swarm/services/#create-services-using-templates。因此,swarm 似乎尝试(但失败)解析我只想传递给 logspout 容器的 ENV 变量的值。
我的问题
这是告诉 swarm 不要解析 RAW_FORMAT 变量中的 go-template 的方法吗?
如果没有,是否有其他方法可以将此变量设置为正确的值?
More...
如果你想重现这个问题,这里有一个最小的 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
first.