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 
  1. 没有任何标志运行

     docker run hello-docker 

    这将在我的控制台上打印“Hello-docker”并退出

  2. 使用-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