Dockerfile CMD 指令将在运行后立即退出容器

新手上路,请多包涵

我想在容器启动时设置一些配置,为此我使用的是 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”并退出

  1. 使用 -itd 标志运行
   docker run -itd hello-docker

和下面我的控制台输出一样,这次也将很快退出。 :( 在此处输入图像描述

  • 当我运行其他图像时,我在 COMMAND 部分看到的不同之处在于,命令部分将显示“/bin/bash”,并将继续以分离模式运行。

  • 当我使用 shell 脚本在容器中运行我的图像时,COMMAND 部分将显示“/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 映像,将不会执行 CMD 指令。 :(

 sudo docker run -it --entrypoint=/bin/bash <imagename>

原文由 Anand Suthar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

最后通过一些实验,我得到了最好的结果,如下所示

我的 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),如下所示,vola 一切都以我最好的方式工作。

 #!/bin/bash

echo “Hello-docker” > /usr/hello.txt

/bin/bash

原文由 Anand Suthar 发布,翻译遵循 CC BY-SA 3.0 许可协议

只要 Dockerfile 中的 CMD 占用,docker 容器就会运行。

在您的情况下,您的 CMD 由一个包含单个回声的 shell 脚本组成。所以容器会在完成回显后退出。

您可以覆盖 CMD ,例如:

 sudo docker run -it --entrypoint=/bin/bash <imagename>

这将在您的容器中启动一个交互式 shell,而不是执行您的 CMD 。退出该外壳后,您的容器将立即退出。

如果您希望您的容器保持活动状态,您必须确保您的 CMD 继续运行。例如,通过将 while true; do sleep 1; done 添加到您的 shell.sh 文件中,您的容器将打印您的 hello 消息,然后在您停止它之前不再执行任何操作(在另一个终端中使用 docker stop)。

您可以使用 docker exec -it <containername> bash 在正在运行的容器中打开一个 shell。如果您随后执行命令 ps ax ,它将显示您的 shell.sh 仍在容器内运行。

原文由 NZD 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题