如何将 PowerShell 脚本指定为 Docker 容器入口点?

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

我需要 运行 一个 [Windows] Docker 容器作为可执行文件,运行宁一个相当复杂的 PowerShell 脚本(调用 Java 和.NET 应用程序)并退出。 Docker documentation 建议为此目的使用 ENTRYPOINT。所以我继续创建了一个包含以下内容的 Docker 文件:

FROM microsoft/dotnet-framework
COPY run.ps1 /
ENTRYPOINT [ "powershell.exe", "C:\run.ps1" ]

run.ps1 的内容(针对此问题进行了超级简化):

gci
write-host "looks like everything is good!"

然后,我运行执行以下命令:

# Build the Docker image
docker build --rm -t testdockerps .

# Create/run container using above image
docker run -it testdockerps

容器 运行 成功,显示 C:\ 的内容后跟消息 - looks like everything is good!.

根据我的观察,我有几个问题:

  1. 基于 Windows 的 Docker 容器的默认 shell 是多少?有没有办法将它设置为 PowerShell,这样我就不必将 "powershell" 指定为 ENTRYPOINT JSON 数组的第一个元素?我应该在 Docker 文件中使用 SHELL 命令吗?
  2. 创建和运行安装容器大约需要 3-4 秒,这在某种程度上是可以理解的,但是在 PS1 脚本完成后,容器退出和运行需要将近 10 秒的时间(值得怀疑) return 到命令提示符。延迟的原因可能是什么?

是的,你可以指定 powershell 作为默认值 shell,如下面的 DOCKERFILE SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]

我不确定您能否对停止 VM 所需的时间采取任何措施