【问题标题】:Docker - Container is not runningDocker - 容器未运行
【发布时间】:2015-06-18 10:15:31
【问题描述】:

我完全是 docker 新手。我试图启动一个退出的容器,如下所示,

  1. 我使用docker ps -a 列出了所有可用的容器。它列出了以下内容:

  2. 我输入了以下命令来启动处于退出阶段的容器并进入该图像的终端。

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. 它抛出以下错误。

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

但是当我使用docker start 79b3fa70b51d 启动容器时。如果一切正常,它将容器 ID 作为输出抛出,这是正常的。我不确定是什么导致了这个错误。关于这方面的原因和建议的任何想法都会对我有很大帮助。提前致谢。

【问题讨论】:

  • 您好,请您解释一下您是如何解决此问题的。恐怕下面的答案没有多大意义
  • @ApexFred,Docker 容器不像虚拟机;它们旨在运行应用程序。当应用程序终止时,容器也会终止。在这种情况下,用户已将容器的“应用程序”设置为“echo”命令。因为“echo”命令执行回显然后终止,容器也随着命令终止。如果他再次启动容器,它会执行回显并再次终止。 EXEC 命令需要一个正在运行的容器。由于容器已终止,因此无法用于运行其他命令。

标签: docker docker-container


【解决方案1】:

默认情况下,如果容器上没有运行任何任务,docker 容器将立即退出。

要让容器在后台运行,请尝试使用--detach(或-d)参数运行它。

例如:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

【讨论】:

    【解决方案2】:

    容器79b3fa70b51d 似乎只做echo

    这意味着它开始,回显然后立即退出。

    下一个docker exec command 不会发现它正在运行,以便将自己附加到该容器并执行任何命令:为时已晚。容器已经退出。

    docker exec 命令在正在运行的容器中运行一个新命令。

    使用docker exec 启动的命令只会在容器的主进程(PID 1)运行时运行

    【讨论】:

    • 您好 VonC,感谢您的评论。如何实现进入图像的终端?
    • @Udhayakumar 一个简单的docker run -it --rm udhayakumar/busyboxwithtouch 应该足以打开一个会话。默认入口点应该是 /bin/sh,但这取决于你的 Dockerfile:你可能已经定义了不同的入口点和/或不同的 CMD。
    • 您好,请您解释一下您是如何解决此问题的。恐怕这个答案没有多大意义
    • @Jawad 通过不带任何参数运行busyboxwithtouch,它默认为交互式shell(不会立即退出)。这意味着您可以稍后 (docker exec) 附加到它。
    • @questionto42 奇怪:如果入口点已经是 sh 或 bash,那就足够了,如 stackoverflow.com/a/70079149/6309 所示。
    【解决方案3】:

    如果无法再次启动主进程(足够长的时间),也可以将容器 commit 到一个新映像并从该映像运行一个新容器。虽然这不是通常的最佳实践工作流程(新图像不可重复),但我发现偶尔调试失败的脚本非常有用。

    docker exec -it 6198ef53d943 bash
    Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running
    
    docker commit 6198ef53d943
    sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
    
    docker run -it ace7ca65e6e bash
    root@72d38a8c787d:/#
    

    【讨论】:

    • 我遵循了相同的步骤,但新创建的容器无法从之前可访问的浏览器中访问
    • 请注意,该命令会在容器中启动bash 进程。您之前可能运行过一个网络服务器,因此您必须检查需要使用哪个命令来恢复服务器。
    • 对我来说,我需要bash,而不是-c /bin/bash
    【解决方案4】:

    这发生在脚本不启动等待请求的服务的图像上,因此容器在脚本结束时退出。

    大多数基本操作系统映像(centos、debian 等)或 node 映像通常都是这种情况。

    最好的办法是以交互模式运行图像。下面的示例带有 节点图像

    docker run -it node /bin/bash
    

    输出是

    root@cacc7897a20c:/# echo $SHELL
    /bin/bash
    

    【讨论】:

      【解决方案5】:

      首先,我们要启动docker容器

      ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021
      
                              3a19b39ea021
      

      之后,检查 docker 容器:

      ankit@ankit-HP-Notebook:~$  sudo docker ps -a
      
       CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES
      
        3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
        Up 9 seconds                                 ubuntu1
      
        455b66057060        hello-world                   "/hello"            4 weeks ago         
      
      Exited (0) 4 weeks ago                       vigorous_bardeen
      

      然后使用以下命令执行:

      ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash
      
      root@3a19b39ea021:/# 
      

      【讨论】:

      • 添加有助于解释答案的文本会很有帮助。
      【解决方案6】:

      这对我有用。

      获取容器ID并重启。

      docker ps -a --no-trunc 
      
      ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
      
      
      docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
      

      【讨论】:

        【解决方案7】:
        docker run -it --entrypoint /bin/bash <imageid>
        

        这是 L0j1k 在下面的帖子中发布的,对我有用。

        How do I get into a Docker container's shell?

        【讨论】:

        • 有时代替 /bin/bash 使用 /bin/sh
        【解决方案8】:

        原因正是公认的答案所说的。我添加了一些额外的信息,这可能会提供对这个问题的进一步理解。

        1. 容器的状态包括Created, Running, Stopped, ExitedDead 和我知道的其他人。
        2. 当我们执行docker create时,docker daemon 会创建一个 状态为 Created 的容器。
        3. docker start时,docker daemon 会启动一个已有的容器 其状态可能是CreatedStopped
        4. 当我们执行docker run时,docker daemon 会分两步完成 步骤:docker createdocker start
        5. docker stop 时,显然 docker daemon 会停止一个容器。 因此容器将处于Stopped 状态。
        6. 来到最重要的一个,容器实际上想象自己 在其中举行了很长时间的过程。当进程退出时, 容器保存过程也会退出。因此这个状态 容器将是Exited

        进程何时退出?换句话说,过程是什么,我们是如何开始的?
        答案是 dockerfile 中的 CMD 或以下表达式中的 command,在某些图像中默认为 bash,即 ubutu:18.04。

        docker run ubuntu:18.04 [command]
        

        【讨论】:

          【解决方案9】:

          docker run -it &lt;image_id&gt; /bin/bash

          以交互模式运行,然后执行 bash shell

          【讨论】:

          • 我认为-d 标志在这里是一个错字?
          【解决方案10】:

          对于任何尝试使用 Dockerfile 进行类似操作的人...

          以分离模式运行无济于事。如果命令是非阻塞的,容器将始终退出(停止运行),bash 就是这种情况。

          在这种情况下,解决方法是: 1. 提交生成的图像: (container_name = 您要作为图像基础的容器的名称, image_name = 要创建的图像的名称 码头工人提交容器名称图像名称 2. 使用 docker run 使用新镜像创建一个新容器,指定要运行的命令。在这里,我将运行“bash”: docker run -it image_name bash

          这将为您提供您正在寻找的交互式登录。

          【讨论】:

            【解决方案11】:

            这里是docker容器正常退出,可以编辑Dockerfile时的解决方案。

            通常,当 docker 容器运行时,应用程序通过运行命令来提供服务。来自Dockerfile reference

            CMD 和 ENTRYPOINT 指令都定义了什么时候执行的命令 运行一个容器。 ... Dockerfile 应至少指定 CMD 或 ENTRYPOINT 命令之一。

            当您构建映像并且未使用 CMD 或 ENTRYPOINT 指定任何命令时,将执行基础映像的 CMD 或 ENTRYPOINT 命令。

            例如,官方的 Ubuntu Dockerfile 有 CMD ["/bin/bash"] (https://hub.docker.com/_/ubuntu)。现在,bin/bash/ 命令可以接受输入,docker run -it IMAGE_ID 命令将 STDIN 附加到容器。结果是您获得了一个交互式终端,并且容器继续运行。

            当在 Dockerfile 中指定带有 CMD 或 ENTRYPOINT 的命令时,该命令会在容器运行时执行。现在,如果这个命令可以在不需要任何输入的情况下完成,它将完成并且容器将退出。在这种情况下,docker run -it IMAGE_ID提供交互式终端。一个例子是从下面的 Dockerfile 构建的 docker 镜像-

            FROM ubuntu
            ENTRYPOINT echo hello 
            

            如果你需要去这个镜像的终端,你需要通过修改入口点命令来保持容器运行。

            FROM ubuntu
            ENTRYPOINT echo hello && sleep infinity 
            

            docker run IMAGE_ID正常运行容器后,你可以去另一个终端,用docker exec -it CONTAINER_ID bash获取容器的终端。

            【讨论】:

            • “你可以编辑 Dockerfile”:关键点在这里。赞成。
            【解决方案12】:

            使用命令

            > docker container ls
            
            > docker image ls
            

            检查您的图像 ID 并记下它。这里我的 Image id 是 "6c929ca002da" ,你们必须使用自己的 Image id 而不是我的..

            > docker start 6c929ca002da 
            

            这里我们的图像处于关闭模式,我们必须首先使用图像 ID 启动它。 6c929ca002da 是我的图片ID

            > `docker exec -it 6c929ca002da bash`
            

            运行此命令后,您可以看到 像这样在运行模式下的图像文件

            root@6c929ca002da

            这里我使用的是root模式,通过命令进入root模式

            须藤苏

            【讨论】:

              【解决方案13】:

              对于这个活跃的社区来说可能为时已晚,但有很多原因,因为容器可能无法正确执行并退出写入控制台消息。对于所有制作 nodeJS 容器的新手,我建议您更改 Dockerfile 并删除您可能拥有的所有 CMD 和 ENTRYPOINT,并仅在 ["/bin/sh"] 中添加一个 ENTRYPOINT(请参阅我附加的测试 Dockerfile 示例)。然后重建 Docker 镜像并使用命令运行它:

              docker run -it --rm your_named_image:tag
              

              瞧,您将进入带有外壳的容器。然后你可以测试你的应用程序,自己输入命令,即 node app.js,看看发生了什么。看到一切正常后,您可以更改 docker 文件并将 ENTRYPOINT 擦除为“/bin/sh”并使用自己,即 ["node","app.js"] 或其他任何内容。始终考虑这篇文章以前的答案;当容器内的应用程序完成时,它将停止正在运行的容器。

              这是我的“测试”Dockerfile 的示例:

              FROM node:16.4.0-alpine
              ENV NODE_ENV=production
              WORKDIR /app
              COPY ["package.json","package-lock.json*", "./"]
              RUN npm install --production
              COPY ./dist .
              ENTRYPOINT ["/bin/sh"]
              

              注意:我在本地计算机上的应用程序 (.js) 的源文件位于目录 ./dist 中,因此我必须在容器中进行复制,如您所见。

              【讨论】:

              • 永远不会太晚。赞成。
              【解决方案14】:

              就我而言,我更改了 Dockerfile 父目录的某些文件名和目录名。由于哪个容器没有找到重新启动它所需的参数。

              将其重命名为原始名称后,容器开始像黄油一样。

              【讨论】:

                【解决方案15】:

                我对此有不同的看法。我可以做一个 docker ps 并看到有一个 docker 容器正在运行,我什至尝试重新启动它,但是当我尝试使用 New-PSSession -ContainerId $containerId -RunAsAdministrator 为其获取会话时它会出错,说:

                ##[error]New-PSSession : 输入的ContainerId xxx 不存在, ##[error]或者对应的容器没有运行。

                我的问题是我正在使用网络服务运行,它没有足够的权限来查看容器,即使我已授予它运行 docker 命令的权限(使用 docker 安全组配置)

                我不知道如何启用容器,所以我不得不恢复为以管理员用户身份运行它

                【讨论】:

                  【解决方案16】:

                  在我的例子中,我之前已经杀死了正在运行的容器,

                  sudo docker kill testdeb

                  所以当我执行容器时出现错误,

                  Error response from daemon: Container fcc29295fe78a425155c533506f58fc5b30a50ee9eb85c21031e8699b3f6ff01 is not running

                  解决方案是启动容器,

                  sudo docker start testdeb

                  现在我有一个容器正在运行,

                  sudo docker ps

                  容器 ID 图像命令创建状态端口名称 fcc29295fe78 debian "bash" 9 小时前 Up 11 seconds testdeb

                  之前没有运行过

                  【讨论】:

                  【解决方案17】:

                  我尝试的以下方法适用于 windows vscode 环境。

                  docker run --name yourcontainer -p 3306:3306 -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql

                  我看到很多类似的答案,但添加端口号'-p 3306:3306',使状态启动并运行。您可以使用命令 docker ps -a 进行验证

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-12-01
                    • 1970-01-01
                    • 2019-03-04
                    • 1970-01-01
                    • 2020-02-23
                    • 2017-09-27
                    • 1970-01-01
                    • 2022-10-04
                    相关资源
                    最近更新 更多