Docker swarm пытается проанализировать значение переменной ENV в моем compose-файле (потому что в нем есть шаблон go) и выдает ошибку - PullRequest
0 голосов
/ 17 октября 2018

Ошибка

Я пытаюсь запустить контейнер logspout и установить формат журнала (переменная ENV) через файл docker-compose.Не так уж сложно, и если я запускаю его с docker-compose up, все работает нормально.Но когда я пытаюсь запустить его с помощью docker swarm init и docker stack deploy -c docker-compose.yml mystack, я получаю сообщение об ошибке:

Ошибка ответа от демона: ошибка rpc: code = InvalidArgument desc = расширение env не удалось: расширение env"RAW_FORMAT = {\" container \ ": \" {{.Container.Name}} \ ", \" label \ ": {{toJSON .Container.Config.Labels}}, \" timestamp \ ": \" {{.Time.Format \ "2006-01-02T15: 04: 05Z07: 00 \"}} \ ", \" source \ ": \" {{.Source}} \ ", \" message \ ": {{toJSON .Data}}} ": template: расширение: 1: функция" toJSON "не определена

Что я понимаю

Я думаю, что у меня ошибка только с роем, а не с докером-compose, потому что переменная ENV, которую я хочу передать в logspout:

RAW_FORMAT: '{"container": "{{.Container.Name}}", "tags": {{toJSON.Container.Config.Labels}}, "отметка времени": "{{.Time.Format" 2006-01-02T15: 04: 05Z07: 00 "}}", "source": "{{.Source}}","message": {{toJSON .Data}}} '

Эта переменная ENV содержит шаблон go.Но в режиме роя вы можете создавать сервисы, используя go-шаблоны .Похоже, что Swarm пытается (и не может) проанализировать значение переменной ENV, которую я просто хочу передать в контейнер logspout.

Мой вопрос

  1. Isэто способ сказать рое не анализировать go-шаблон в моей переменной RAW_FORMAT?

  2. Если нет, есть ли другой способ установить эту переменную на правильное значение?

Подробнее ...

Если вы хотите воспроизвести эту проблему, вот минимальный файл для создания docker:

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 голосов
/ 04 апреля 2019

Вы можете деформироваться по {{` string `}}

  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}})`}}
0 голосов
/ 17 октября 2018

В шаблонах 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 }} }'
...