关于bash:Dockerfile CMD指令将在运行后立即退出容器

Dockerfile CMD instruction will exit the container just after running it

我想在容器启动时设置一些配置,为此我使用shell脚本。但一旦脚本结束,我的容器就会退出,我尝试了-d标志/分离模式,但它永远不会以分离模式运行。

下面是我的档案

1
2
3
4
5
6
7
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

下面是我的剧本

1
2
#!/bin/bash
echo Hello-docker
  • 不带任何标志运行

    1
    docker run hello-docker

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

  • 使用-itd标志运行

    1
    docker run -itd hello-docker

    和我的控制台输出一样,这一次也将很快退出。:(enter image description here

    • 我在命令部分看到的区别是,当我运行其他图像时,命令部分将显示"/bin/bash",并将以分离模式继续。

    • 当我在带有shell脚本的容器中运行图像时,命令部分将显示"/bin/sh-c/usr/loca",然后退出。

    • 我想运行容器,直到我不手动停止它。

  • EDIT:

    在dockerfile中添加entrypoint指令后,将不会执行shell脚本:(

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    As per docker documentation here

    当使用可选参数运行容器时,将重写cmd,因此如果我使用下面的某些参数运行docker image,将不会执行cmd指令。:(

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

    docker容器的运行时间与dockerfile中的CMD的运行时间相同。

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

    您可以覆盖CMD,例如:

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

    这将在容器中启动交互式shell,而不是执行CMD。一旦您退出外壳,您的容器就会退出。

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

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


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

    我的dockerfile没有什么问题,它是正确的。

    1
    2
    3
    4
    5
    6
    7
    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以我最好的方式工作。

    1
    2
    3
    4
    5
    #!/bin/bash

    echo"Hello-docker"> /usr/hello.txt

    /bin/bash


    您还可以修改第一个dockerfile,替换

    CMD /usr/local/bin/shell.sh

    通过

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

    这样,脚本不会终止,并且容器保持运行。


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