Docker 对于 Windows 将 ENV 变量传递给 Docker 文件中的 CMD 不起作用
Docker for Windows passing ENV variable to CMD in Dockerfile doesn't work
我在Docker文件
中有以下说明
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) 样式。
尝试了这些帖子的建议:
对我没用。
这是来自 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
将 ENV 传递给(在本例中)ENTRYPOINT 命令的正确语法是
ENTRYPOINT powershell c:\RunAll.ps1 -NewConnString %DB_CONN_STRING%
因此,您需要使用 shell 语法和 windows cmd.exe 参数格式。 ENTRYPOINT 的 Exec 语法对我不起作用。
要传递带有空格的长字符串作为参数,您需要使用不同的双引号,例如
docker.exe run -d --rm -e DB_CONN_STRING="'Data Source=DB2;Initial Catalog=Db;User ID=sa;Password=p@ssw0rd'"
我在Docker文件
中有以下说明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) 样式。
尝试了这些帖子的建议:
对我没用。
这是来自 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
将 ENV 传递给(在本例中)ENTRYPOINT 命令的正确语法是
ENTRYPOINT powershell c:\RunAll.ps1 -NewConnString %DB_CONN_STRING%
因此,您需要使用 shell 语法和 windows cmd.exe 参数格式。 ENTRYPOINT 的 Exec 语法对我不起作用。 要传递带有空格的长字符串作为参数,您需要使用不同的双引号,例如
docker.exe run -d --rm -e DB_CONN_STRING="'Data Source=DB2;Initial Catalog=Db;User ID=sa;Password=p@ssw0rd'"