【问题标题】:How do I specify a PowerShell script as a Docker container entry point?如何将 PowerShell 脚本指定为 Docker 容器入口点?
【发布时间】:2018-04-16 07:04:49
【问题描述】:

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

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 数组的第一个元素?我应该在 Dockerfile 中使用SHELL 命令吗?
  2. 创建和运行容器大约需要 3-4 秒,这在某种程度上可以理解,但是在 PS1 脚本完成后,容器退出并返回命令提示符需要将近 10 秒的时间。造成这种延迟的原因可能是什么?

【问题讨论】:

    标签: powershell docker docker-for-windows docker-entrypoint


    【解决方案1】:

    是的,您可以在 DOCKERFILE 之上将 powershell 指定为默认 shell,如下所示 SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]

    我不确定您是否可以对关闭虚拟机所需的时间采取任何措施

    【讨论】:

    • 添加SHELL没有任何效果,即我仍然需要指定"powershell"作为ENTRYPOINT的第一个参数。否则,Docker 容器会失败。看起来 SHELL 仅对 Dockerfile 中定义的 RUN 命令有用,但实际上并未将 PowerShell 设置为容器中的默认 shell。我也学到了一些东西,我使用的是ENTRYPOINTexec 形式,所以显然没有shell。但是,如果指定 Write-Host "hello world"echo hello world,容器如何知道选择哪种类型的运行时环境?
    • 下面为我工作FROM microsoft/windowsservercore:1709 SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"] ENTRYPOINT Write-output "hello"
    • 感谢您的澄清。我想在容器中设置一个环境变量并覆盖入口点以打印容器环境中的所有环境变量。我使用了这个命令,但遇到了问题:docker run --entrypoint "powershell" <image> --env HOSTNAME=$Env:COMPUTERNAME "gci Env:*"unexpected tokenmissing expression 出现错误。但是没有--env 参数,相同的命令也能正常工作。这是为什么呢?
    • 这对我来说很好,并将test 打印为输出docker run --entrypoint "powershell" --env HOSTNAME="test" microsoft/windowsservercore:1709 "gci Env:HOSTNAME" 尝试将图像放在 --env 参数之后
    • 是的,将图像名称放在--env 之后有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多