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
,
Exited
、Dead
和我知道的其他人。
当我们执行docker create
时,docker daemon 会创建一个
状态为 Created
的容器。
docker start
时,docker daemon 会启动一个已有的容器
其状态可能是Created
或Stopped
。
当我们执行docker run
时,docker daemon 会分两步完成
步骤:docker create
和 docker start
。
docker stop
时,显然 docker daemon 会停止一个容器。
因此容器将处于Stopped
状态。
来到最重要的一个,容器实际上想象自己
在其中举行了很长时间的过程。当进程退出时,
容器保存过程也会退出。因此这个状态
容器将是Exited
。
进程何时退出?换句话说,过程是什么,我们是如何开始的?
答案是 dockerfile 中的 CMD
或以下表达式中的 command
,在某些图像中默认为 bash
,即 ubutu:18.04。
docker run ubuntu:18.04 [command]
【讨论】:
【参考方案9】:docker run -it <image_id> /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 运行启动容器,但 localhost 未加载(Windows 10)