我正在使用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的新手,正在尝试学习,但是我不知道在搜索互联网和阅读文档时发生了什么
答案 0 :(得分:3)
我认为dockerfile中的RUN
命令有一个困惑:它没有说明容器启动时将要运行的内容,它只是在构建映像时运行的命令(例如运行此安装)命令..)。
我认为您正在寻找以下两种选择之一:
dockerfile(doc)中的CMD
行:
FROM microsoft/windowsservercore
CMD ["powershell", "Start-Sleep", "-s", "1000"]
或者,您可以从命令行运行它:
docker run -d mybuild <your command>