docker run -d 后 Docker 容器会自动停止

新手上路,请多包涵

根据我目前阅读的教程,使用“ docker run -d ”将从图像启动一个容器,容器将在后台运行。这是它的样子,我们可以看到我们已经有了容器 id。

 root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

但是,如果我运行“ docker ps ”,则没有返回任何内容。

所以我尝试了“ docker ps -a ”,我可以看到容器已经退出:

 root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

我做错什么了吗?如何解决此问题?

原文由 J John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

centos dockerfile 有一个默认命令 bash

这意味着,当在后台运行时( -d ),shell 会立即退出。

2017 年更新

最新版本的 docker 授权在 分离模式 前台模式 下运行容器( -t-i-it

在这种情况下,您不需要任何额外的命令,这就足够了:

 docker run -t -d centos

bash 将在后台等待。

最初在 kalyani-chaudhari回答 中报告了这一点,并在 jersey bean回答 中详细说明了这一点。

 vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

请注意,对于 alpineMarinos An 在评论中 报告:

docker run -t -d alpine/git 不会保持进程正常。

不得不做: docker run --entrypoint "/bin/sh" -it alpine/git


原始答案(2015)

本文所述

建议不要使用 --- docker run -i -t image your-command 运行,而是使用 -d 因为您只需一个命令即可运行容器,而无需通过 按 Ctrl + P + Q 来分离容器的终端.

但是, -d 选项有问题。 除非命令继续在前台运行,否则您的容器会立即停止

Docker 要求您的命令继续在前台运行。否则,它会认为您的应用程序停止并关闭容器。

问题是某些应用程序没有在前台运行。我们怎样才能让它变得更容易?

在这种情况下,您可以将 tail -f /dev/null 添加到您的命令中。

通过这样做,即使您的主命令在后台运行,您的容器也不会停止,因为 tail 一直在前台运行。

所以这会起作用:

 docker run -d centos tail -f /dev/null

或者在 Dockerfile 中:

 ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]

docker ps 会显示 centos 容器仍在运行。

从那里,您可以 附加到它或从它分离(或 docker exec 一些命令)。

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据 这个答案,添加 -t 标志将防止容器在后台运行时退出。然后您可以使用 docker exec -i -t <image> /bin/bash 进入 shell 提示符。

 docker run -t -d <image> <command>

似乎 -t 选项 没有很好地记录,尽管帮助说它“分配了一个伪 TTY”。

原文由 cjsimon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题