Dockerfile CMD指令将在运行后立即退出容器
我想在我的容器启动时设置一些configuration,因为我使用的是shell脚本。 但是当我的脚本结束时,我的容器就会退出,我尝试了-d标志/分离模式,但是它永远不会以分离模式运行。
以下是我的Dockerfile
FROM ubuntu:14.04 ADD shell.sh /usr/local/bin/shell.sh RUN chmod 777 /usr/local/bin/shell.sh CMD /usr/local/bin/shell.sh
下面是我的shell脚本
#!/bin/bash echo Hello-docker
-
没有任何标志运行
docker run hello-docker
这将在我的控制台上打印“Hello-docker”并退出
-
使用-itd标志运行
docker run -itd hello-docker
和下面我的控制台输出,这一次也将很快退出。 🙁
-
我看到的区别是在命令部分,当我运行其他图像命令部分将显示“/ bin / bash”,并将继续在分离模式。
-
而当我运行我的图像在shell脚本容器与命令部分将显示“/ bin / sh -c / usr / loca”,并退出。
-
我想运行容器,直到我没有手动停止它。
-
编辑:
在Dockerfile中添加ENTRYPOINT指令后,这将不会执行我的shell脚本:(
FROM ubuntu:14.04 ADD shell.sh /usr/local/bin/shell.sh RUN chmod 777 /usr/local/bin/shell.sh CMD /usr/local/bin/shell.sh ENTRYPOINT /bin/bash
根据docker文件在这里
运行带有替代参数的容器时,CMD将被覆盖,所以如果我用下面的一些参数运行docker image,将不会执行CMD指令。 🙁
sudo docker run -it --entrypoint=/bin/bash <imagename>
你也可以修改你的第一个Dockerfile,replace
CMD /usr/local/bin/shell.sh
通过
CMD /usr/local/bin/shell.sh ; sleep infinity
这样,您的脚本不会终止,并且您的容器保持运行状态。
docker容器将运行,只要您的Dockerfile CMD
需要。
在你的情况下,你的CMD
由一个包含单个回声的shell脚本组成。 所以容器将在完成回声后退出。
您可以覆盖CMD
,例如:
sudo docker run -it --entrypoint=/bin/bash <imagename>
这将在您的容器中启动交互式shell,而不是执行您的CMD
。 一旦你退出壳体,你的容器就会退出。
如果您希望容器保持活动状态,则必须确保您的CMD
继续运行。 例如,通过添加行while true; do sleep 1; done
while true; do sleep 1; done
while true; do sleep 1; done
到你的shell.sh文件,你的容器将打印你的消息,然后什么都不做,直到你停止它(在另一个terminal使用docker停止)。
您可以使用docker exec -it <containername> bash
在正在运行的容器中打开一个shell。 如果你执行命令ps ax
,它会告诉你你的shell.sh仍然在容器中运行。
最后通过一些实验,我得到了最好的结果如下
我的Dockerfile没有错,下面是正确的。
FROM ubuntu:14.04 ADD shell.sh /usr/local/bin/shell.sh RUN chmod 777 /usr/local/bin/shell.sh CMD /usr/local/bin/shell.sh
我得到预期的结果是,我只是在我的shell脚本文件中添加一个命令(/ bin / bash),如下所示,挥发一切工作在我最好的方式。
#!/bin/bash echo “Hello-docker” > /usr/hello.txt /bin/bash