Docker swarm尝试解析我的撰写文件中的ENV变量的值(因为其中包含go模板),并给了我一个错误

时间:2018-10-17 12:47:29

标签: docker docker-compose docker-swarm go-templates docker-swarm-mode

错误

我尝试启动一个logspout容器,并通过一个docker-compose文件设置日志格式(一个ENV变量)。不太困难,如果我用docker-compose up启动它,一切都很好。但是,当我尝试使用docker swarm initdocker 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变量的值。

我的问题

  1. 是否可以告诉swarm不要在RAW_FORMAT变量中解析go-template?

  2. 如果没有,是否还有其他方法可以将此变量设置为正确的值?

更多...

如果您想重现此问题,这是一个最小的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

2 个答案:

答案 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}})`}}