Символ точки в docker составных переменных среды не работает - PullRequest
0 голосов
/ 14 июля 2020

У меня есть файл docker -compose с такими переменными среды, как:

 identity-api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://0.0.0.0:80
      - SpaClient=http://${ESHOP_EXTERNAL_DNS.NAME_OR_IP}:5104

Это просто пример из https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/docker-compose.override.yml.

Проблема : Здесь я заменил символ подчеркивания символом точки: ESHOP_EXTERNAL_DNS_NAME_OR_IP -> ESHOP_EXTERNAL_DNS.NAME_OR_IP. После этого, если я попытаюсь создать проект docker -compose в VS, это не сработает. Ошибка выглядит так:

Error   DT1001  Invalid interpolation format for "environment" option in service "identity-api":"SpaClient=http://${ESHOP_EXTERNAL_DNS.NAME_OR_IP}:5104"    
docker-compose  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Sdks\Microsoft.Docker.Sdk\build\Microsoft.VisualStudio.Docker.Compose.targets 202 

Итак, вопрос: что здесь не так с именем переменной? Поддерживается точечный символ или нет? Или, может быть, от него как-нибудь сбежать?

1 Ответ

0 голосов
/ 14 июля 2020

В общем, имена переменных среды с точками в них разрешены на техническом уровне, но не поддерживаются ни в каком контексте, и я бы выбрал другое имя.

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

Я думаю, что переменные с точками в них также не поддерживаются в сценариях оболочки, но мне трудно это доказать. Я читал POSIX spe c. A Имя также состоит только из букв ASCII, цифр и знаков подчеркивания; параметры либо имеют имя, номер или единственный символ; а переменные - параметры с именами; но ни в одном формальном описании этого не говорится, что «имя» - это Имя.

Одна простая вещь, которую можно продемонстрировать, - это запуск оболочки bash в образе ubuntu Docker. Мы можем использовать параметр docker run -e для установки произвольных переменных среды (которые не содержат =), но мы не можем использовать какие-либо функции оболочки для расширения переменных точками:

host$ docker run --rm -it -e foo=A -e foo.bar=B ubuntu
# Demonstrate the environment variable is set:
root@227bec28c674:/# env | grep foo
foo.bar=B
foo=A
# It won't get expanded without braces:
root@227bec28c674:/# echo $foo.bar
A.bar
# With braces, it's considered illegal syntax:
root@227bec28c674:/# echo ${foo.bar}
bash: ${foo.bar}: bad substitution
...