当前位置: 首页 > 知识库问答 >
问题:

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

彭硕
2023-03-14

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

    这将在我的控制台和出口打印“你好码头工人”

    使用-itd标志运行

    docker run -itd hello-docker
    

    >

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

    当我使用shell脚本在容器中运行映像时,命令部分将显示“/bin/sh-c/usr/loca”,并退出。

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

    编辑:

    在Dockerfile中添加入口点指令后,将不会执行我的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>
    
  • 共有3个答案

    戈建白
    2023-03-14

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

    CMD/usr/local/bin/shell.sh

    CMD/usr/local/bin/shell.sh;无限睡眠

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

    郑星辰
    2023-03-14

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

    我的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
    
    孟杰
    2023-03-14

    只要docker文件中的CMDdocker容器就会运行。

    在您的示例中,您的CMD由一个包含单个echo的shell脚本组成。因此,容器将在完成回显后退出。

    您可以重写CMD,例如:

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

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

    如果您希望您的容器保持活动状态,您必须确保您的CMD保持运行。例如,通过在您的shell.sh文件中添加行,而true;do睡眠1;完成,您的容器将打印您的Hello消息,然后不再做任何事情,直到您停止它(在另一个终端中使用docker停止)。

    您可以使用docker exec-it在运行的容器中打开shell

     类似资料:
    • 容器总是在创建和运行后立即退出。 我尝试使用命令运行mssql实例 当尝试类似的SO link link时 它显示 但在run命令中我已经设置了'accept_eula=y'。

    • 问题内容: 我在后台运行一个容器 它迅速退出。但是,如果我在前台运行,则可以正常运行。我使用检查了日志 没有错误。有任何想法吗? DOCKERFILE start-all.sh 问题答案: 一个Docker容器的主要过程完成后退出。 在这种情况下,它将在脚本结束时退出。我对hadoop不太了解,无法在这种情况下告诉您如何做,但是您需要要么在前台运行某些东西,要么使用诸如runit或supervis

    • 问题内容: 我准备了一个docker-compose文件来部署带有数据库的容器: 没关系。但是现在我需要创建一个数据库并建立其结构。我需要执行一些sql命令。为了检查我是否能够做到这一点,我将其添加到服务中: 但是我遇到以下错误: 我感觉命令是在Sql Server实例启动之前执行的。我该如何解决?Sql Server启动后如何执行一些sql? 问题答案: 问题是在容器中仅执行一个命令。当您在其中

    • 本文向大家介绍Docker 在后台运行容器,包括了Docker 在后台运行容器的使用技巧和注意事项,需要的朋友参考一下 示例 要使容器在后台运行,请-d在容器启动期间提供命令行选项: 该选项-d以分离模式运行容器。它也等效于-d=true。 处于分离模式的容器停止时不能自动删除,这意味着不能将--rm选项与-d选项结合使用。

    • 问题内容: 我正在尝试学习如何将docker compose与nginx容器的简单设置结合使用,该设置将请求重新路由到ghost容器。我正在使用标准的鬼影图像,但是有一个自定义的nginx图像(继承自标准图像)。 当我使用“ docker-compose up”运行合成文件时,它会立即退出,而“ docker_nginx_1以代码0退出”。但是,当我手动构建并运行它时,它运行良好,并且可以将浏览器