132

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

  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 作为输出抛出,这是正常的。我不确定是什么导致了这个错误。关于这方面的原因和建议的任何想法都会对我有很大帮助。提前致谢。

4

17 回答 17

99

默认情况下,如果您没有在容器上运行任何任务,docker 容器将立即退出。

要保持容器在后台运行,请尝试使用--detach(or -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:/# 
于 2017-07-23T23:40:29.450 回答
49

Container79b3fa70b51d似乎只做一个echo.

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

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

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

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

于 2015-04-13T07:13:11.637 回答
29

如果无法再次启动主进程(足够长的时间),也有可能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:/#
于 2018-03-10T01:34:57.773 回答
14

这发生在脚本没有启动等待请求的服务的图像上,因此容器在脚本结束时退出。

大多数基本操作系统映像(centos、debian 等)或节点映像通常都是这种情况。

最好的办法是在交互模式下运行图像。下面的示例与节点图像

docker run -it node /bin/bash

输出是

root@cacc7897a20c:/# echo $SHELL
/bin/bash
于 2019-11-29T18:11:43.790 回答
11

首先,我们要启动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:/# 
于 2018-08-31T16:32:38.140 回答
10

这对我有用。

获取容器 ID 并重新启动。

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
于 2020-06-23T15:55:10.283 回答
9
docker run -it --entrypoint /bin/bash <imageid>

这是 L0j1k 在下面的帖子中发布的,对我有用。

如何进入 Docker 容器的外壳?

于 2020-08-20T16:30:08.700 回答
4

docker run -it <image_id> /bin/bash

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

于 2020-02-24T10:13:57.717 回答
4

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

  1. 据我所知,容器的状态包括CreatedRunningStopped、 和其他。ExitedDead
  2. 当我们执行时docker create,docker daemon 将创建一个容器,其状态为Created.
  3. docker start,docker daemon 将启动一个现有容器,其状态可能是CreatedStopped
  4. 当我们执行时docker run,docker daemon 将分两步完成它:docker createdocker start.
  5. 什么时候docker stop,显然 docker daemon 会停止一个容器。因此容器将处于Stopped状态。
  6. 最重要的是,一个容器实际上想象自己在其中保存了一个长时间的进程。当进程退出时,容器持有进程也将退出。因此这个容器的状态是Exited

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

docker run ubuntu:18.04 [command]
于 2018-09-05T02:48:29.480 回答
3

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

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

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

这将为您提供您正在寻找的交互式登录。

于 2020-06-14T15:28:44.697 回答
2

使用命令

> docker container ls

> docker image ls

检查您的图像 ID 并记下它。这里我的图像 id 是“6c929ca002da”,你们必须使用自己的图像 id 而不是我的 ..

> docker start 6c929ca002da 

这里我们的图像处于关闭模式,我们必须首先使用图像 ID 启动它。6c929ca002da 是我的图像 ID

> `docker exec -it 6c929ca002da bash`

运行此命令后,您可以像这样在运行模式下看到您的图像文件

根@6c929ca002da

在这里我使用root模式通过使用命令进入root模式

须藤

于 2021-04-26T05:24:36.527 回答
2

下面是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 

如果你需要去这个镜像的终端,你需要通过修改入口点命令来保持容器运行。

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

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

于 2020-10-30T17:19:37.853 回答
1

对于这个活跃的社区来说可能为时已晚,但有很多原因,因为容器可能无法正确执行并退出写入控制台消息。对于所有制作 nodeJS 容器的新手,我建议您更改 Dockerfile 并删除您可能拥有的所有 CMD 和 ENTRYPOINT,并仅将 ENTRYPOINT 添加到 ["/bin/sh"] (请参阅我附加的测试 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 上,因此我必须在容器中进行复制,如您所见。

于 2021-11-23T10:24:10.023 回答
0

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

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

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

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

于 2020-08-29T00:09:00.687 回答
0

就我而言,我之前已经杀死了正在运行的容器,

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 小时前 11 秒 testdeb

以前没有运行

于 2021-11-13T05:58:37.890 回答
0

就我而言,我更改了 Dockerfile 父目录的某些文件名和目录名。由于哪个容器没有找到重新启动它所需的参数。

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

于 2019-12-07T05:48:06.727 回答
0

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

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

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

于 2021-12-30T06:05:14.517 回答