Docker - Container未运行

时间:2015-04-13 07:07:12

标签: docker docker-container

我完全是码头工人的新手。我试图启动一个退出的容器,如下,

  1. 我使用docker ps -a列出了所有可用的容器。它列出了以下内容, docker list all images
  2. 我输入以下命令来启动处于退出阶段的容器并进入该图像的终端。

    docker start 79b3fa70b51d  docker exec -it 79b3fa70b51d \bin\sh

  3. 抛出以下错误。

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

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

14 个答案:

答案 0 :(得分:31)

默认情况下,如果您没有在容器上运行任何任务,则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:/# 

答案 1 :(得分:18)

容器79b3fa70b51d似乎只执行echo

这意味着它会启动,回显然后立即退出。

下一个docker exec command将无法运行,以便将自身附加到该容器并执行任何命令:为时已晚。容器已经退出。

  

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

     

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

答案 2 :(得分:9)

如果无法再次启动主进程(足够长时间),则还有可能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:/#

答案 3 :(得分:5)

这对我有用。

获取容器ID并重新启动。

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

答案 4 :(得分:4)

docker run -it --entrypoint /bin/bash <imageid>

这是L0j1k在下面的帖子中发布的,并为我工作。

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

答案 5 :(得分:3)

首先,我们必须启动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 :(得分:3)

docker run -it <image_id> /bin/bash

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

答案 7 :(得分:2)

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

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

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

这将为您提供所需的交互式登录名。

答案 8 :(得分:1)

原因就是所接受的答案所说的。我添加了一些额外的信息,这些信息可以使您对该问题有进一步的了解。

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

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

docker run ubuntu:18.04 [command]

答案 9 :(得分:1)

这种情况会在立即退出的图像上发生,例如,因为没有命令触发服务等待请求。

因此,您可以仅以交互方式运行图像。下面的示例带有节点图片

docker run -it node /bin/bash

输出为

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

答案 10 :(得分:1)

这是当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 

如果需要转到该映像的终端,则需要通过修改entrypoint命令来保持容器运行。

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

使用docker run IMAGE_ID正常运行容器后,您可以转到另一个终端并使用docker exec -it CONTAINER_ID bash来获取容器的终端。

答案 11 :(得分:0)

就我而言,我更改了Dockerfile父目录的某些文件名和目录名。由于哪个容器找不到所需的参数才能再次启动它。

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

答案 12 :(得分:0)

对此我有不同的看法。我可以做一个docker ps并看到有一个docker容器正在运行,我什至试图重新启动它,但是一旦我尝试与New-PSSession -ContainerId $containerId -RunAsAdministrator进行会话,它就会出错,说:

## [错误] New-PSSession:输入的ContainerId xxx不存在, ## [错误]或相应的容器未运行。

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

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

答案 13 :(得分:0)

使用命令

> 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模式

<块引用>

sudo su