我有一个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
问题是:这里的变量名有什么问题?是否支持点符号?还是可以通过某种方式逃脱?
答案 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