Docker - 容器未运行

Posted

技术标签:

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

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

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

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

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

    它抛出以下错误。

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

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

【问题讨论】:

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

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

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

之前没有运行过

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案17】:

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

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

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

【讨论】:

以上是关于Docker - 容器未运行的主要内容,如果未能解决你的问题,请参考以下文章

docker中出现容器未运行无法进入容器的操作

docker 运行启动容器,但 localhost 未加载(Windows 10)

markdown 显示未在Docker中运行的容器

Docker 无法使用 mysql 链接到未运行的容器

cron 作业未在 ubuntu 上的 docker 容器内运行

Docker 容器中的 Wildfly 未启动