泊坞窗中的点符号构成环境变量不起作用

时间:2020-07-14 10:18:59

标签: visual-studio docker docker-compose

我有一个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。 之后,如果我尝试在VS中构建docker-compose项目,它将无法正常工作。该错误看起来像:

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 :(得分:0)

通常,在技术级别上允许使用带点号的环境变量名称,但在任何情况下都不能很好地支持它,因此我会选择其他名称。

在Docker Compose中,看来the regexps used to identify variable expansions仅支持ASCII字母,数字和下划线。这表明不支持环境变量名称中的点,也无法转义它们。

我认为Shell脚本也不支持其中带有点的变量,但是我很难向自己证明如何阅读POSIX规范。 Name也仅由ASCII字母,数字和下划线组成; parameters可以有名称,数字或单个符号;变量是带有名称的参数;但是对此的正式描述都没有说“名称”是名称。

一个容易演示的事情是在bash Docker映像中运行ubuntu shell。我们可以使用docker run -e选项来设置任意环境变量(不包含=),但是我们实际上不能使用任何shell功能来用点扩展变量:

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