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

时间:2018-07-20 19:12:30

标签: docker docker-for-windows

我正在使用Windows Server 2016来启动windowsservercore docker容器,并注意到我认为是不正确的行为,即使该容器应该休眠15分钟以上,该容器也会非常快速地退出。我有以下Dockerfile

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

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

看着this answer,看来应该使容器保持存活状态。该答案表明Linux不确定是否重要,但是我感觉无论哪种情况,睡眠进程都在运行,这就是确定容器是否默认退出的原因

如果我使用交互模式和/或(我尝试了所有3种组合)一个tty(docker run -it mybuild),它会一直停留到退出容器外壳为止

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

我也试过在睡眠后运行另一个命令,但这仍然没有用。然后,docker文件如下所示:

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

我看着dockerfile reference for RUN,它说RUN以外壳形式在Windows上使用cmd /S /C执行命令。因此,我尝试像在Dockerfile指定的{cmd /S /C powershell Start-Sleep -s 1000一样,从我的宿主Windows计算机上的普通外壳运行此脚本,并验证了它是否可以正常工作。

我在这里不明白什么?我是Docker的新手,正在尝试学习,但是我不知道在搜索互联网和阅读文档时发生了什么

1 个答案:

答案 0 :(得分:3)

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

dockerfile(doc)中的CMD行:

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

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

docker run -d mybuild <your command>