Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker for Windows passing ENV variable to CMD in Dockerfile doesn't work

I have the following instructions in 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"]

When I run this command

docker run --rm -d -e DB_CONN_STRING="Test" test

DB_CONN_STRING is always empty inside RunAll.ps1. How can I pass ENV to CMD?

When I use CMD without parameters

CMD ["powershell", "c:\\RunAll.ps1"]

all works correctly.

RunAll.ps1 code:

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

I tried several approaches, exec and shell command styles, $DB_CONN_STRING, ${DB_CONN_STRING} and $(DB_CONN_STRING) styles.

Tried suggestions from these posts:

  • Use docker run command to pass arguments to CMD in Dockerfile

  • How do I use Docker environment variable in ENTRYPOINT array?

Nothing works for me.

Here is an example from Docker log:

[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 version 17.03.0-ce, build 60ccb22

like image 886
Vladimir Avatar asked Mar 27 '17 14:03

Vladimir


1 Answers

The correct syntax for passing ENV to (in this case) ENTRYPOINT command will be

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

So, you need to use the shell syntax and windows cmd.exe parameters format. Exec syntax of ENTRYPOINT haven't worked for me. And to pass long string with spaces as parameter you will need to use double different quotes, for example

docker.exe run -d --rm -e DB_CONN_STRING="'Data Source=DB2;Initial Catalog=Db;User ID=sa;Password=p@ssw0rd'"
like image 159
Vladimir Avatar answered Sep 20 '22 17:09

Vladimir