首页 文章

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

提问于
浏览
21

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

并且在我的控制台输出下面,这次也将很快退出 . :(
enter image description here

  • 我看到的差异在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

根据这里的docker文档

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

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

4 回答

  • 1

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

    我的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
    
  • 9

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

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

    您可以覆盖 CMD ,例如:

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

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

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

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

  • 12

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

    CMD /usr/local/bin/shell.sh

    通过

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

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

  • 10
    CMD bash -C '/path/to/start.sh';'bash'
    

相关问题