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

Ana*_*har 35 bash shell sh docker dockerfile

我想在容器启动时设置一些配置,为此我使用的是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
Run Code Online (Sandbox Code Playgroud)

下面是我的shell脚本

#!/bin/bash
echo Hello-docker
Run Code Online (Sandbox Code Playgroud)
  1. 没有任何标志运行

    docker run hello-docker
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 使用-itd标志运行

    docker run -itd hello-docker
    
    Run Code Online (Sandbox Code Playgroud)

    并且在我的控制台输出下面,这次也将很快退出. :( 在此输入图像描述

    • 我看到的差异在COMMAND部分,当我运行其他图像命令部分将显示"/ bin/bash"并将继续处于分离模式.

    • 当我在带有shell脚本的容器中运行我的图像时,COMMAND部分将显示"/ bin/sh -c/usr/loca"和Exit.

    • 我想运行容器直到我不能手动停止它.

编辑:

在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
Run Code Online (Sandbox Code Playgroud)

根据这里的 docker文档

使用备用参数运行容器时将覆盖CMD,因此如果我使用如下所示的某些参数运行docker image,则不会执行CMD指令.:(

sudo docker run -it --entrypoint=/bin/bash <imagename>
Run Code Online (Sandbox Code Playgroud)

NZD*_*NZD 19

只要CMDDockerfile中有一个docker 容器就会运行.

在您的情况下,您CMD包含一个包含单个回声的shell脚本.因此容器将在完成回声后退出.

您可以覆盖CMD,例如:

sudo docker run -it --entrypoint=/bin/bash <imagename>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 但我也想执行我的脚本,并且不想手动执行它。那就是问题所在。 (3认同)

Ana*_*har 18

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

我的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
Run Code Online (Sandbox Code Playgroud)

我得到的预期结果是,我只需在我的shell脚本文件中添加一个命令(/ bin/bash),如下所示,并且一切都以我最好的方式工作.

#!/bin/bash

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

/bin/bash
Run Code Online (Sandbox Code Playgroud)


use*_*097 15

您也可以修改您的第一个Dockerfile,替换

CMD /usr/local/bin/shell.sh

通过

CMD /usr/local/bin/shell.sh ; sleep infinity

这样,您的脚本不会终止,并且您的容器仍在运行.

  • 你也可以在你的CMD中做一些事情,比如`bash -C'/ path/to/start.sh';'bash'这样,当你的脚本完成时,你有一个shell,请参见http://www.markbetz.净/ 2014/03/17 /泊坞窗 - 运行启动的脚本,然后退出到一个壳/ (4认同)

lan*_*321 5

CMD bash -C '/path/to/start.sh';'bash'
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可能会解决问题,但 [包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。 (14认同)