How do I specify a PowerShell script as a Docker container entry point?

Web User picture Web User · Apr 16, 2018 · Viewed 14.7k times · Source

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:

  1. 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 the SHELL command in the Dockerfile?
  2. 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?

Answer

Gregory Suvalian picture Gregory Suvalian · Apr 16, 2018

Yes you can specify powershell as default shell like below on top of DOCKERFILE SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]

I'm not sure you can do anything about time it takes to spin down your VM