Docker swarm 尝试解析我的 compose 文件中 ENV 变量的值(因为它有一个 go 模板)并给我一个错误

2024-04-04

错误

我尝试启动一个 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 变量的值。

我的问题

  1. 这是告诉 swarm 不要解析 RAW_FORMAT 变量中的 go-template 的方法吗?

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

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.


在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 }} }'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker swarm 尝试解析我的 compose 文件中 ENV 变量的值(因为它有一个 go 模板)并给我一个错误 的相关文章

随机推荐