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

    并在我的控制台输出下方,这一次也将很快退出。 :(
    bash - Dockerfile CMD指令将在运行容器后立即退出容器-LMLPHP
  • 运行其他图像时,我在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文档here

    使用替代参数运行容器时,CMD将被覆盖,因此,如果我使用以下某些参数运行docker image,将不会执行CMD指令。 :(
    sudo docker run -it --entrypoint=/bin/bash <imagename>
    

    最佳答案

    只要您的Dockerfile中的CMD需要,Docker容器就会运行。

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

    您可以覆盖CMD,例如:

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

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

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

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

    07-28 01:22
    查看更多