Docker - 容器不是 运行
Docker - Container is not running
我完全是 docker 的新手。我尝试启动一个退出的容器,如下所示,
我使用 docker ps -a
列出了所有可用的容器。它列出了以下内容:
我输入了以下命令来启动处于exited阶段的容器并进入该镜像的终端。
docker start 79b3fa70b51d
docker exec -it 79b3fa70b51d /bin/sh
抛出以下错误。
FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running
但是当我使用 docker start 79b3fa70b51d
启动容器时。如果一切正常,它会将容器 ID 作为输出抛出,这是正常的。我不确定是什么原因导致此错误。关于此原因的任何想法和建议都会对我有很大帮助。提前致谢。
容器 79b3fa70b51d
似乎只做一个 echo
。
这意味着它开始,回显然后立即退出。
下一个 docker exec
command 找不到它 运行 以便将其自身附加到该容器并执行任何命令:为时已晚。容器已经退出。
The docker exec
command runs a new command in a running container.
The command started using docker exec
will only run while the container's primary process (PID 1) is running
默认情况下,如果容器上没有任何任务 运行ning,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:/#
如果无法再次启动主进程(足够长的时间),也有可能 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:/#
首先,我们要启动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:/#
原因就是接受的答案所说的。我添加了一些额外的信息,这可能会提供对这个问题的进一步理解。
- 容器的状态包括
Created
、Running
、Stopped
、
Exited
、Dead
以及我所知道的其他人。
- 当我们执行
docker create
,docker守护进程会创建一个
状态为 Created
. 的容器
- 当
docker start
、docker守护进程将启动一个现有容器
它的状态可能是 Created
或 Stopped
.
- 当我们执行
docker run
时,docker守护进程会分两次完成
步骤:docker create
和 docker start
.
- 当
docker stop
时,显然docker守护进程会停止一个容器。
因此容器将处于 Stopped
状态。
- 最重要的来了,一个容器实际上想象自己
持有很长一段时间的过程。当进程退出时,
容器持有过程也会退出。因此这个状态
容器将是
Exited
.
进程什么时候退出?换句话说,流程是什么,我们是怎么开始的?
答案是 docker 文件中的 CMD
或以下表达式中的 command
,在某些图像中默认为 bash
,即 ubutu:18.04。
docker run ubuntu:18.04 [command]
This happens with images for which the script does not launch a service awaiting requests, therefore the container exits at the end of the script.
大多数基础 OS 映像(centos、debian 等)或 node 映像通常都是这种情况。
您最好的选择是 运行 以交互模式 图像 。以下示例使用 节点图像 :
docker run -it node /bin/bash
输出为
root@cacc7897a20c:/# echo $SHELL
/bin/bash
在我的例子中,我更改了 Dockerfile 的父目录的某些文件名和目录名。由于哪个容器找不到重新启动所需的参数。
将其重命名回原始名称后,容器开始像黄油一样。
docker run -it <image_id> /bin/bash
运行 在交互模式下执行 bash shell
对于任何尝试使用 Dockerfile 进行类似操作的人...
运行 在分离模式下无济于事。如果命令是非阻塞的,容器将始终退出(停止 运行ning),bash.
就是这种情况
在这种情况下,解决方法是:
1.提交生成的图像:
(container_name = 您要作为图像基础的容器的名称,
image_name = 要创建的图像的名称
docker 提交 container_name image_name
2. 使用docker 运行 使用新镜像创建一个新容器,指定你想要运行 的命令。在这里,我将运行"bash":
docker 运行 -it image_name bash
这将为您提供所需的交互式登录。
这是对我有用的方法。
获取容器 ID 并重新启动。
docker ps -a --no-trunc
ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker run -it --entrypoint /bin/bash <imageid>
这是由 L0j1k 在下面 post 编辑的 post 并且对我有用。
我对此有不同的看法。我可以做一个 docker ps
并看到有一个 docker 容器 运行ning,我什至试图重新启动它,但是当我试图用 New-PSSession -ContainerId $containerId -RunAsAdministrator
它会出错,说:
##[error]New-PSSession : The input ContainerId xxx does not exist,
##[error]or the corresponding container is not running.
我的问题是我是 运行 网络服务,它没有足够的权限来查看容器,即使我已经授予它对 运行 docker 命令的权限(使用docker安全组配置)
我不知道如何启用容器,所以我不得不恢复为 运行以管理员用户身份使用它
这是docker容器正常退出时的解决方案,可以编辑Dockerfile。
通常,当 docker 容器是 运行 时,应用程序由 运行 命令提供服务。来自Dockerfile reference,
Both CMD and ENTRYPOINT instructions define what command gets executed when
running a container. ...
Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
当您构建镜像且未指定任何带有 CMD 或 ENTRYPOINT 的命令时,将执行基础镜像的 CMD 或 ENTRYPOINT 命令。
例如,官方 Ubuntu Dockerfile 有 CMD ["/bin/bash"]
(https://hub.docker.com/_/ubuntu)。现在,bin/bash/
命令可以接受输入并且 docker run -it IMAGE_ID
命令将 STDIN 附加到容器。结果是您获得了一个交互式终端并且容器保持 运行ning.
当在 Dockerfile 中指定带有 CMD 或 ENTRYPOINT 的命令时,此命令会在 运行 连接容器时执行。现在,如果这个命令可以在不需要任何输入的情况下完成,它将完成并且容器将退出。在这种情况下,docker run -it IMAGE_ID
将 不 提供交互式终端。一个示例是从下面的 Dockerfile 构建的 docker 图像-
FROM ubuntu
ENTRYPOINT echo hello
如果你需要去这个镜像的终端,你需要通过修改entrypoint命令来保持容器运行ning
FROM ubuntu
ENTRYPOINT echo hello && sleep infinity
在运行使用docker run IMAGE_ID
正常连接容器后,您可以转到另一个终端并使用docker exec -it CONTAINER_ID bash
获取容器的终端。
使用命令
> docker container ls
> docker image ls
检查您的图像 ID 并记下它。这里我的图片id是“6c929ca002da”,你们必须使用自己的图片id而不是我的..
> docker start 6c929ca002da
这里我们的图像处于关闭模式,我们必须先使用图像 ID 启动它。
6c929ca002da 是我的图片 id
> `docker exec -it 6c929ca002da bash`
在运行这个命令之后你可以看到
你的图像文件在 运行 模式下是这样的
root@6c929ca002da
这里我使用的是root模式,使用命令进入root模式
sudo su
在我的例子中,我之前用
杀死了 运行 容器
sudo docker kill testdeb
所以当我执行容器时出现错误,
Error response from daemon: Container fcc29295fe78a425155c533506f58fc5b30a50ee9eb85c21031e8699b3f6ff01 is not running
解决方案是启动容器,
sudo docker start testdeb
现在我有一个容器 运行 ,
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcc29295fe78 debian "bash" 9 hours ago Up 11 seconds testdeb
以前不是运行
对于这个活跃的社区来说也许为时已晚,但是有很多原因,因为容器可能无法正确执行并退出写入控制台消息。对于所有制作 nodeJS 容器的新手,我建议您更改 Docker 文件并删除您可能拥有的所有 CMD 和 ENTRYPOINT,并仅向 ["/bin/sh"] 添加一个 ENTRYPOINT(请参阅我的附件测试 Docker 文件示例)。然后重建 Docker 图像和 运行 使用命令:
docker run -it --rm your_named_image:tag
瞧,您将进入带有 shell 的容器。然后你可以测试你的应用程序,自己输入命令,即 node app.js ,看看发生了什么。看到一切正常后,您可以更改 docker 文件并将 ENTRYPOINT 擦除为“/bin/sh”并使用您自己,即 [“node”,“app.js”] 或其他。始终考虑以前对此的回答 post;当容器内的应用程序完成时,它将停止 运行ning 容器。
这是我的“测试”示例Docker文件:
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 中,因此我必须在容器中复制,如您所见。
我尝试的以下方法适用于 windows vscode 环境。
docker 运行 --name yourcontainer -p 3306:3306 -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql
我看到很多类似的答案,但添加了端口号“-p 3306:3306”,使状态上升并 运行ning。可以使用命令 docker ps -a
来验证
我完全是 docker 的新手。我尝试启动一个退出的容器,如下所示,
我使用
docker ps -a
列出了所有可用的容器。它列出了以下内容:我输入了以下命令来启动处于exited阶段的容器并进入该镜像的终端。
docker start 79b3fa70b51d docker exec -it 79b3fa70b51d /bin/sh
抛出以下错误。
FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running
但是当我使用 docker start 79b3fa70b51d
启动容器时。如果一切正常,它会将容器 ID 作为输出抛出,这是正常的。我不确定是什么原因导致此错误。关于此原因的任何想法和建议都会对我有很大帮助。提前致谢。
容器 79b3fa70b51d
似乎只做一个 echo
。
这意味着它开始,回显然后立即退出。
下一个 docker exec
command 找不到它 运行 以便将其自身附加到该容器并执行任何命令:为时已晚。容器已经退出。
The
docker exec
command runs a new command in a running container.The command started using
docker exec
will only run while the container's primary process (PID 1) is running
默认情况下,如果容器上没有任何任务 运行ning,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:/#
如果无法再次启动主进程(足够长的时间),也有可能 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:/#
首先,我们要启动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:/#
原因就是接受的答案所说的。我添加了一些额外的信息,这可能会提供对这个问题的进一步理解。
- 容器的状态包括
Created
、Running
、Stopped
、Exited
、Dead
以及我所知道的其他人。 - 当我们执行
docker create
,docker守护进程会创建一个 状态为Created
. 的容器
- 当
docker start
、docker守护进程将启动一个现有容器 它的状态可能是Created
或Stopped
. - 当我们执行
docker run
时,docker守护进程会分两次完成 步骤:docker create
和docker start
. - 当
docker stop
时,显然docker守护进程会停止一个容器。 因此容器将处于Stopped
状态。 - 最重要的来了,一个容器实际上想象自己
持有很长一段时间的过程。当进程退出时,
容器持有过程也会退出。因此这个状态
容器将是
Exited
.
进程什么时候退出?换句话说,流程是什么,我们是怎么开始的?
答案是 docker 文件中的 CMD
或以下表达式中的 command
,在某些图像中默认为 bash
,即 ubutu:18.04。
docker run ubuntu:18.04 [command]
This happens with images for which the script does not launch a service awaiting requests, therefore the container exits at the end of the script.
大多数基础 OS 映像(centos、debian 等)或 node 映像通常都是这种情况。
您最好的选择是 运行 以交互模式 图像 。以下示例使用 节点图像 :
docker run -it node /bin/bash
输出为
root@cacc7897a20c:/# echo $SHELL
/bin/bash
在我的例子中,我更改了 Dockerfile 的父目录的某些文件名和目录名。由于哪个容器找不到重新启动所需的参数。
将其重命名回原始名称后,容器开始像黄油一样。
docker run -it <image_id> /bin/bash
运行 在交互模式下执行 bash shell
对于任何尝试使用 Dockerfile 进行类似操作的人...
运行 在分离模式下无济于事。如果命令是非阻塞的,容器将始终退出(停止 运行ning),bash.
就是这种情况在这种情况下,解决方法是: 1.提交生成的图像: (container_name = 您要作为图像基础的容器的名称, image_name = 要创建的图像的名称 docker 提交 container_name image_name 2. 使用docker 运行 使用新镜像创建一个新容器,指定你想要运行 的命令。在这里,我将运行"bash": docker 运行 -it image_name bash
这将为您提供所需的交互式登录。
这是对我有用的方法。
获取容器 ID 并重新启动。
docker ps -a --no-trunc
ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker run -it --entrypoint /bin/bash <imageid>
这是由 L0j1k 在下面 post 编辑的 post 并且对我有用。
我对此有不同的看法。我可以做一个 docker ps
并看到有一个 docker 容器 运行ning,我什至试图重新启动它,但是当我试图用 New-PSSession -ContainerId $containerId -RunAsAdministrator
它会出错,说:
##[error]New-PSSession : The input ContainerId xxx does not exist, ##[error]or the corresponding container is not running.
我的问题是我是 运行 网络服务,它没有足够的权限来查看容器,即使我已经授予它对 运行 docker 命令的权限(使用docker安全组配置)
我不知道如何启用容器,所以我不得不恢复为 运行以管理员用户身份使用它
这是docker容器正常退出时的解决方案,可以编辑Dockerfile。
通常,当 docker 容器是 运行 时,应用程序由 运行 命令提供服务。来自Dockerfile reference,
Both CMD and ENTRYPOINT instructions define what command gets executed when running a container. ... Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
当您构建镜像且未指定任何带有 CMD 或 ENTRYPOINT 的命令时,将执行基础镜像的 CMD 或 ENTRYPOINT 命令。
例如,官方 Ubuntu Dockerfile 有 CMD ["/bin/bash"]
(https://hub.docker.com/_/ubuntu)。现在,bin/bash/
命令可以接受输入并且 docker run -it IMAGE_ID
命令将 STDIN 附加到容器。结果是您获得了一个交互式终端并且容器保持 运行ning.
当在 Dockerfile 中指定带有 CMD 或 ENTRYPOINT 的命令时,此命令会在 运行 连接容器时执行。现在,如果这个命令可以在不需要任何输入的情况下完成,它将完成并且容器将退出。在这种情况下,docker run -it IMAGE_ID
将 不 提供交互式终端。一个示例是从下面的 Dockerfile 构建的 docker 图像-
FROM ubuntu
ENTRYPOINT echo hello
如果你需要去这个镜像的终端,你需要通过修改entrypoint命令来保持容器运行ning
FROM ubuntu
ENTRYPOINT echo hello && sleep infinity
在运行使用docker run IMAGE_ID
正常连接容器后,您可以转到另一个终端并使用docker exec -it CONTAINER_ID bash
获取容器的终端。
使用命令
> docker container ls
> docker image ls
检查您的图像 ID 并记下它。这里我的图片id是“6c929ca002da”,你们必须使用自己的图片id而不是我的..
> docker start 6c929ca002da
这里我们的图像处于关闭模式,我们必须先使用图像 ID 启动它。 6c929ca002da 是我的图片 id
> `docker exec -it 6c929ca002da bash`
在运行这个命令之后你可以看到 你的图像文件在 运行 模式下是这样的
root@6c929ca002da
这里我使用的是root模式,使用命令进入root模式
sudo su
在我的例子中,我之前用
杀死了 运行 容器sudo docker kill testdeb
所以当我执行容器时出现错误,
Error response from daemon: Container fcc29295fe78a425155c533506f58fc5b30a50ee9eb85c21031e8699b3f6ff01 is not running
解决方案是启动容器,
sudo docker start testdeb
现在我有一个容器 运行 ,
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcc29295fe78 debian "bash" 9 hours ago Up 11 seconds testdeb
以前不是运行
对于这个活跃的社区来说也许为时已晚,但是有很多原因,因为容器可能无法正确执行并退出写入控制台消息。对于所有制作 nodeJS 容器的新手,我建议您更改 Docker 文件并删除您可能拥有的所有 CMD 和 ENTRYPOINT,并仅向 ["/bin/sh"] 添加一个 ENTRYPOINT(请参阅我的附件测试 Docker 文件示例)。然后重建 Docker 图像和 运行 使用命令:
docker run -it --rm your_named_image:tag
瞧,您将进入带有 shell 的容器。然后你可以测试你的应用程序,自己输入命令,即 node app.js ,看看发生了什么。看到一切正常后,您可以更改 docker 文件并将 ENTRYPOINT 擦除为“/bin/sh”并使用您自己,即 [“node”,“app.js”] 或其他。始终考虑以前对此的回答 post;当容器内的应用程序完成时,它将停止 运行ning 容器。
这是我的“测试”示例Docker文件:
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 中,因此我必须在容器中复制,如您所见。
我尝试的以下方法适用于 windows vscode 环境。
docker 运行 --name yourcontainer -p 3306:3306 -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql
我看到很多类似的答案,但添加了端口号“-p 3306:3306”,使状态上升并 运行ning。可以使用命令 docker ps -a
来验证