在Dockerfile中将ENV变量传递给CMD的Windows Docker不起作用

时间:2017-03-27 14:35:26

标签: docker-windows

我在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

在RunAll.ps1中,DB_CONN_STRING始终为空。 如何将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,build 60ccb22

1 个答案:

答案 0 :(得分:2)

将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'"