I need to run a [Windows] Docker container as an executable, running a rather involved PowerShell script (invoking Java and .NET applications) and exiting. Docker documentation suggests using ENTRYPOINT
for this purpose. So I went ahead and created a Dockerfile with the following contents:
FROM microsoft/dotnet-framework
COPY run.ps1 /
ENTRYPOINT [ "powershell.exe", "C:\\run.ps1" ]
The contents of run.ps1
(uber-simplified for this question):
gci
write-host "looks like everything is good!"
Then, I ran the following commands:
# Build the Docker image
docker build --rm -t testdockerps .
# Create/run container using above image
docker run -it testdockerps
The container ran successfully, displaying the contents of C:\
followed by the message - looks like everything is good!
.
I have a couple of questions based on what my observations:
- What is the default shell for a Windows based Docker container? Is there any way to set it to PowerShell, so I don't have to specify "powershell" as the first element of the
ENTRYPOINT
JSON array? Should I be using theSHELL
command in the Dockerfile? - Creating and running the container takes about 3-4 seconds which is somewhat understandable, but after the PS1 script completes, it takes nearly a questionable 10 seconds for the container to exit and return to the command prompt. What may be the cause of this delay?
SHELL
did not take any effect, i.e. I still needed to specify"powershell"
as the first argument toENTRYPOINT
. Otherwise, the Docker container fails. It looks likeSHELL
is only useful forRUN
commands defined in the Dockerfile, but it does not actually set PowerShell as the default shell in the container. I learnt something too, that I am using the exec form ofENTRYPOINT
, so there is apparently no shell. But still, how does the container know which type of runtime environment to pick up if specifyWrite-Host "hello world"
versusecho hello world
? – Trihedral