Docker-Container 没有运行

我完全是一个新手到码头。我试图启动一个退出的集装箱像下面这样,

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

    docker list all images

  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 作为输出抛出,如果所有东西都正常工作,那么这个输出就是正常的。我不确定是什么导致了这个错误。任何关于这个问题的原因和建议都会对我有很大的帮助。先谢谢你。

378686 次浏览

容器 79b3fa70b51d似乎只做一个 echo

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

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

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

使用 docker exec启动的命令仅在容器的主进程(PID 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:/#

如果不可能再次启动主进程(时间足够长) ,那么还有可能将容器 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:/#

首先,我们必须启动码头集装箱

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021


3a19b39ea021

之后,检查码头集装箱:

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:/#

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

  1. 容器的状态包括 CreatedRunningStopped、, ExitedDead和其他我所知道的。
  2. 当我们执行 docker create时,docker 守护进程将创建一个 其状态为 Created的集装箱。
  3. docker start时,docker 守护进程将启动一个现有容器 其状态可能是 CreatedStopped
  4. 当我们执行 docker run时,docker 守护进程将在两个步骤内完成 步骤: docker createdocker start
  5. docker stop时,显然 docker 守护进程将停止一个容器。 因此容器将处于 Stopped状态。
  6. 来到最重要的一个,容器实际上想象自己 当进程退出时,该进程将在其中保存一个长时间的进程 集装箱持有过程也将退出。因此,这个地位 集装箱是 Exited

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

docker run ubuntu:18.04 [command]

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

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

您最好的选择是运行图像 交互模式:

docker run -it node /bin/bash

输出是

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

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

在将其重新命名为原来的名称后,容器开始像奶油一样。

docker run -it <image_id> /bin/bash

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

对于任何试图使用 Dockerfile 做类似事情的人..。

在分离模式下运行不会有任何帮助。如果命令是非阻塞的,容器将始终退出(停止运行) ,bash 就是这种情况。

在这种情况下,一种变通方法是: 1. 提交结果图像: (container _ name = 要基于映像的容器的名称, Image _ name = 要创建的图像的名称 Docker 提交容器 _ name image _ name 2.使用 docker run 使用新映像创建一个新容器,指定要运行的命令。在这里,我将运行“ bash”: Docker run-it image _ name bash

这将得到您所需的交互式登录。

以下是对我有效的方法。

获取容器 ID 并重新启动。

docker ps -a --no-trunc


ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33




docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
docker run -it --entrypoint /bin/bash <imageid>

这是由 L0j1k 发布在下面的帖子,并为我工作。

我如何进入一个 Docker 容器的外壳?

我有不同的看法。我可以做一个 docker ps,看到有一个 docker 容器运行,我甚至尝试重新启动它,但只要我尝试得到它与 New-PSSession -ContainerId $containerId -RunAsAdministrator会话,它会出错,说:

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

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

我不知道如何启用容器,所以我不得不转而以管理员用户的身份运行它

下面是 Docker 容器正常退出时的解决方案,您可以编辑 Dockerfile。

一般来说,当运行一个 docker 容器时,应用程序是通过运行一个命令来服务的,

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

使用命令

> docker container ls


> docker image ls

检查您的图像 ID 并记录下来。这里我的图像 ID 是“6c929ca002da”,你们必须用你们自己的图像 ID 代替我的。.

> docker start 6c929ca002da

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

> `docker exec -it 6c929ca002da bash`

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

Root@6c929ca002da

这里我使用根模式去根模式通过使用命令

你好

在我的例子中,我先前用,

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

之前并没有运行

对于这个活动社区来说可能太晚了,但是有很多原因,因为容器可能无法正确执行并退出编写控制台消息。对于所有制作 nodeJS 容器的新手,我建议你更改 Dockerfile 并删除你可能拥有的所有 CMD 和 ENTRYPOINT,只在[“/bin/sh”]中添加一个 ENTRYPOINT (参见我附带的测试 Dockerfile 示例)。然后重新构建 Docker 映像并使用以下命令运行它:

docker run -it --rm your_named_image:tag

好了,你们将带着一个贝壳进入集装箱。然后您可以测试您的应用程序输入命令,比如 node app.js,看看发生了什么。看到一切正常后,可以修改 docker 文件并将 ENTRYPOINT 删除为“/bin/sh”,然后使用 i.e [“ 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,所以我必须在容器中进行复制,如您所见。

下面我尝试的方法可以在 windows vscode 环境中工作。

Docker run —— name yourContainer-p 3306:3306-e MYSQL _ ROOT _ PASSWORD = your password-d MYSQL

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