2017-03-27 50 views
2

我在Dockerfile泊塢窗爲Windows傳遞ENV變量Dockerfile到CMD不起作用

ENV DB_CONN_STRING="Data Source=DbServer;Initial Catalog=Db;User ID=sa;[email protected]" 
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;[email protected]" 
) 

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)樣式。從這些帖子

試過建議:

沒有爲我工作。

這裏是從泊塢示例日誌:

[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]} 

多克爾版本17.03.0-CE,建立60ccb22

+0

每泊塢窗指令,CMD指令不調用命令外殼,因此環境變量不可用於提取。 https://docs.docker.com/engine/reference/builder/#cmd你可能會考慮切換到「進入點」,而不是 –

+0

我也嘗試了入口點。順便說一下,從它開始:ENTRYPOINT [「powershell」,「c:\\ RunAll.ps1」,「-NewConnString」,「$ {DB_CONN_STRING}」]。得到相同的結果,然後切換到CMD。 偶試過這樣:SHELL [ 「的PowerShell」]入口點C:\ RunAll.ps1 -NewConnString CMD [ 「$ DB_CONN_STRING」] – Vladimir

+0

下面爲我工作 泊塢文件 ' #逃生=' 從Microsoft/windowsservercore 副本hello.ps1 c:\ 入口文件powershell.exe c:\ hello.ps1 ' hello。ps1是'Write-Output'環境變量是「+(dir env:)' 我可以在下面創建一個運行並查看存在的環境變量 'docker run --rm me/me -e」test = lala「 ' –

回答

1

傳遞到ENV(在這種情況下)的入口點的命令的正確語法將是

ENTRYPOINT powershell c:\RunAll.ps1 -NewConnString %DB_CONN_STRING% 

所以,您需要使用shell語法和windows cmd.exe參數格式。 執行 ENTRYPOINT的語法沒有爲我工作。 並通過長字符串用空格作爲參數,則需要用雙引號不同,例如

docker.exe run -d --rm -e DB_CONN_STRING="'Data Source=DB2;Initial Catalog=Db;User ID=sa;[email protected]'"