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

dar*_*ing 1 docker docker-for-windows

我正在使用 Windows Server 2016 来启动windowsservercoredocker 容器,并注意到我认为不正确的行为,即容器很快退出,即使它应该休眠超过 15 分钟。我有以下内容Dockerfile

FROM microsoft/windowsservercore
RUN powershell Start-Sleep -s 1000
Run Code Online (Sandbox Code Playgroud)

docker build -t mybuild .我使用when构建容器与Dockerfile. 然后我运行容器docker run mybuild,它很快就退出了。

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

如果我使用交互模式和/或(我尝试了所有 3 种组合) tty ( docker run -it mybuild),它会一直保持状态,直到我退出容器的 shell

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

我还尝试在睡眠后运行另一个命令,但仍然不起作用。docker 文件如下所示:

FROM microsoft/windowsservercore
RUN powershell Start-Sleep -s 1000
RUN echo "hello" > C:\hello.txt
Run Code Online (Sandbox Code Playgroud)

我查看了dockerfile 参考RUN,它说以 shell 形式在 Windows 上RUN执行命令。cmd /S /C因此,我尝试从我的 Windows 主机上的普通 shell 中完全按照Dockerfile指定的 ( cmd /S /C powershell Start-Sleep -s 1000) 运行它,并验证它是否按预期工作。

我在这里不明白什么?我是 docker 的新手,正在尝试学习,但我无法弄清楚搜索互联网和阅读文档时发生了什么

Ita*_*ayB 7

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

CMDdockerfile ( doc ) 中的行:

FROM microsoft/windowsservercore
CMD ["powershell", "Start-Sleep", "-s", "1000"]
Run Code Online (Sandbox Code Playgroud)

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

docker run -d mybuild <your command>
Run Code Online (Sandbox Code Playgroud)