【发布时间】:2017-03-28 00:26:17
【问题描述】:
我在 Dockerfile 中有以下说明
ENV DB_CONN_STRING="Data Source=DbServer;Initial Catalog=Db;User ID=sa;Password=p@ssw0rd"
ENTRYPOINT []
CMD ["powershell", "c:\\RunAll.ps1 -NewConnString", "$DB_CONN_STRING"]
当我运行这个命令时
docker run --rm -d -e DB_CONN_STRING="Test" test
DB_CONN_STRING 在 RunAll.ps1 中始终为空。 如何将 ENV 传递给 CMD?
当我使用不带参数的 CMD 时
CMD ["powershell", "c:\\RunAll.ps1"]
一切正常。
RunAll.ps1 代码:
param(
[string]$NewConnString = "Data Source=DbServer;Initial Catalog=db;User ID=sa;Password=p@ssw0rd"
)
New-Item "C:\start_log.txt" -type file -force -value $NewConnString
.\ChangeConnString.ps1 -NewConnString $NewConnString
New-Item "C:\end_log.txt" -type file -force -value $NewConnString
# Run IIS container entry point
.\ServiceMonitor.exe w3svc
我尝试了几种方法,exec 和 shell 命令样式,$DB_CONN_STRING、${DB_CONN_STRING} 和 $(DB_CONN_STRING) 样式。
尝试了这些帖子的建议:
Use docker run command to pass arguments to CMD in Dockerfile
How do I use Docker environment variable in ENTRYPOINT array?
没有什么对我有用。
这是一个来自 Docker 日志的示例:
[16:06:34.505][WindowsDockerDaemon][Info ] time="2017-03-27T16:06:34.505376100+02:00" level=debug msg="HCSShim::Container::CreateProcess id=0909937ce1130047b124acd7a5eb57664e05c6af7cbb446aa7c8015a44393232 config={\"ApplicationName\":\"\",\"CommandLine\":\"powershell c:\\\\RunAll.ps1 -NewConnString $DB_CONN_STRING\",\"User\":\"\",\"WorkingDirectory\":\"C:\\\\\",\"Environment\":{\"DB_CONN_STRING\":\"Test\"},\"EmulateConsole\":false,\"CreateStdInPipe\":true,\"CreateStdOutPipe\":true,\"CreateStdErrPipe\":true,\"ConsoleSize\":[0,0]}
Docker 版本 17.03.0-ce,构建 60ccb22
【问题讨论】:
-
根据 docker 指令,CMD 指令不会调用命令 shell,因此环境变量将不可用于提取。 docs.docker.com/engine/reference/builder/#cmd你可能应该考虑改用“ENTRYPOINT”
-
我也尝试过使用 ENTRYPOINT。顺便说一句,从它开始: ENTRYPOINT ["powershell", "c:\\RunAll.ps1", "-NewConnString", "${DB_CONN_STRING}"] 。有相同的结果,然后切换到 CMD。甚至试过这样: SHELL ["powershell"] ENTRYPOINT c:\RunAll.ps1 -NewConnString CMD ["$DB_CONN_STRING"]
-
下面对我有用 Docker 文件 `#escape=` FROM microsoft/windowsservercore copy hello.ps1 c:\ ENTRYPOINT powershell.exe c:\hello.ps1 ` hello.ps1 是
Write-Output "Environment variable is " + (dir env:)我可以在下面构建一个运行并查看存在的环境变量docker run --rm me/me -e "test=lala" -
您的解决方案部分适用于我。如果我按原样使用它 - 它不起作用。但是,如果我在 Dockerfile 中添加
ENV TEST="test"- 我可以在容器内看到这个环境变量,但我不能用docker run --rm me/me -e TEST="lala"重新分配它 - 它总是显示“测试”。 -
我在容器和powershell方面有点新手,我使用这种方法将参数发送到起始容器。可能还有其他方法可以做到这一点。