为什么 Windows docker 容器在睡眠命令完成之前提前退出?

Why does Windows docker container exit early before sleep command finishes?

我正在使用 Windows 服务器 2016 来启动 windowsservercore docker 容器,我注意到我认为容器退出的不正确行为,即使它应该退出睡超过 15 分钟。我有以下 Dockerfile:

FROM microsoft/windowsservercore
RUN powershell Start-Sleep -s 1000

我在与 Dockerfile 相同的目录中使用 docker build -t mybuild . 构建容器。然后我 运行 带有 docker run mybuild 的容器,它很快退出。

查看 似乎睡眠应该让容器保持活动状态。该答案显示 Linux 所以不确定这是否重要,但我觉得在任何一种情况下睡眠过程都是 运行ning,这就是决定容器是否应该默认退出的因素

如果我使用交互模式 and/or(我尝试了所有 3 种组合)一个 tty (docker run -it mybuild) 它会一直运行直到我退出容器的 shell

查看 docker 文档 run 在前台执行容器(如 -it),尽管我不明白为什么这很重要,因为该过程仍应 运行ning 无论容器是否分离。我还尝试 运行 在分离模式下使用 docker run -d 连接它,在这种情况下它也很快退出。

我也试过 运行在睡眠后使用另一个命令,但仍然没有用。 docker 文件看起来像:

FROM microsoft/windowsservercore
RUN powershell Start-Sleep -s 1000
RUN echo "hello" > C:\hello.txt

我查看了 dockerfile reference for RUN,它说 shell 形式的 RUN 在 Windows 上使用 cmd /S /C 执行命令。所以我在我的主机 Windows 机器上从我的正常 shell 尝试 运行ning 这个,就像 Dockerfile 指定的(cmd /S /C powershell Start-Sleep -s 1000)并验证它按预期工作.

我在这里有什么不明白的?我是 docker 的新手,正在努力学习,但我不知道搜索互联网和阅读文档是怎么回事

我认为 dockerfile 中的 RUN 命令存在混淆:它没有说明容器启动时 运行 会发生什么,它只是 [=21= 的命令] 构建图像时(如 运行 此安装命令..)。 我认为您正在寻找以下两个选项之一:

dockerfile (doc) 中的 CMD 行:

FROM microsoft/windowsservercore
CMD ["powershell", "Start-Sleep", "-s", "1000"]

或者,您可以从命令行运行它:

docker run -d mybuild <your command>