Как я могу избежать знака доллара в файле создания докеров?

91

У меня есть скаляр YAML, который выдает следующую ошибку, когда я пытаюсь оценить свой docker-compose.ymlфайл:

ОШИБКА: неверный формат интерполяции для параметра «среда» в службе «time_service»: «$ {Time.now}»

YAML:

---
version: '2'
services:
  time_service:
    build: "."
    environment:
      TIME: "${Time.now}"

Как я могу сохранить тот же строковый вывод, что и записанный, но не допустить, чтобы docker-compose интерпретировал его как ошибочную интерполяцию строки?

Натан Ханна
источник
1
Это не синтаксический анализатор YAML, который интерпретирует эту строку. YAML не знает о файлах ${}. Интерпретация выполняется docker-composeи написана на Python, поэтому тег ruby ​​также был неуместным.
Anthon
Я удалил неверное предположение, что это проблема YAML. Это привело к тому, что как минимум еще один человек был введен в заблуждение и
Антон

Ответы:

132

Вы можете использовать $$(знак двойного доллара), когда вашей конфигурации нужен буквальный знак доллара.

Вы попадаете в docker-composeподстановку переменных, которая хорошо документирована здесь :

Поддерживаются оба $VARIABLEи ${VARIABLE}синтаксис. Расширенные функции стиля оболочки, такие как ${VARIABLE-default}и ${VARIABLE/foo/bar}, не поддерживаются.

Вы можете использовать $$(знак двойного доллара), когда вашей конфигурации нужен буквальный знак доллара. Это также не позволяет Compose интерполировать значение, поэтому a $$позволяет вам ссылаться на переменные среды, которые вы не хотите обрабатывать Compose.

docker-composeнаписан на Python, как вы видите на github , механизм удвоения для получения исходного значения специальных символов можно найти во многих программах, мне пришлось использовать его самому при программировании еще в 1984 году.

Антон
источник
38

Нашел ответ, скопировав предложение для %персонажей в этом сообщении

Требуется двойной знак доллара $$.

Итак, мне нужно "$${Time.now}", что оценивается как"${Time.now}"

Натан Ханна
источник