Docker-容器未运行


88

我完全是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作为输出输出。我不确定是什么原因导致此错误。关于原因的任何想法和建议对我将大有帮助。提前致谢。


7
您好,能否请您解释一下您如何解决此问题。恐怕下面的答案没有什么意义
-JayPex

4
@ ApexFred,Docker容器不像VM。它们旨在运行应用程序。当应用程序终止时,容器也会终止。在这种情况下,用户已将容器的“应用程序”设置为“ echo”命令。因为“ echo”命令执行回显然后终止,所以容器也随命令终止。如果他再次启动容器,它将执行回显并再次终止。EXEC命令需要一个正在运行的容器。由于容器已终止,因此不能用于运行其他命令。
–duct_tape_coder,

Answers:


30

容器79b3fa70b51d似乎只做一个echo

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

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

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

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


1
嘿VonC,谢谢您的评论。如何实现进入图像终端?
陌生人

3
@Udhayakumar一个简单docker run -it --rm udhayakumar/busyboxwithtouch的会话就足够了。默认入口点应为/ bin / sh,但这取决于您的Dockerfile:您可能已定义了其他入口点和/或不同的CMD。
VonC

50
您好,能否请您解释一下您如何解决此问题。恐怕这个答案没有多大意义
-JayPex

2
@Jawad通过运行不带任何参数的busyboxwithtouch,它默认为交互式外壳程序(不会立即退出)。这意味着您以后可以在(docker exec)上附加它。
VonC

61

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

22

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

我遵循了相同的步骤,但是新创建的容器无法通过以前可访问的浏览器访问
Muhammad Muazzam,

1
请注意,该命令将启动bash容器中的进程。您以前可能已经运行过Web服务器,所以您必须检查需要使用哪个命令来恢复服务器。
马提亚斯·库恩

10

首先,我们必须启动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:/# 

添加有助于解释您的答案的文本将很有帮助。
劳伦·范·史朗

9

对于脚本未启动服务以等待请求的图像,会发生这种情况,因此容器将在脚本末尾退出。

大多数基本OS映像(centos,debian等)或节点映像通常都是这种情况。

最好的选择是以交互方式运行图像。下面带有节点图像的示例:

docker run -it node /bin/bash

输出为

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

5

这对我有用。

获取容器ID并重新启动。

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

原因就是公认的答案。我添加了一些额外的信息,这些信息可以使您进一步了解此问题。

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

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

docker run ubuntu:18.04 [command]


2

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

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

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

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



1

这是当Docker容器正常退出并且您可以编辑Dockerfile时的解决方案。

通常,当运行Docker容器时,通过运行命令为应用程序提供服务。从Dockerfile参考中

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来获取容器的终端。


“并且您可以编辑Dockerfile”:关键点。已投票。
VonC

0

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

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


0

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.