首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Docker容器在docker run -d后会自动停止

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

Stack Overflow用户
提问于 2015-05-13 16:41:06
回答 19查看 618.8K关注 0票数 460

根据我到目前为止读过的教程,使用"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

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

EN

回答 19

Stack Overflow用户

发布于 2016-07-22 18:42:33

根据this answer的说法,添加-t标志将阻止容器在后台运行时退出。然后,您可以使用docker exec -i -t <image> /bin/bash进入shell提示符。

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

看起来-t选项isn't documented very well,尽管帮助中说它“分配了一个伪TTY”。

票数 82
EN

Stack Overflow用户

发布于 2017-10-24 04:34:14

背景

Docker容器运行一个进程(“命令”或“入口点”),使其保持活动状态。只要命令继续运行,容器就会继续运行。

在您的示例中,命令(默认情况下是centos:latest上的bash )会立即退出(就像bash在没有连接到终端并且没有什么可运行时一样)。

通常,当您在守护程序模式下运行容器(使用-d)时,容器会运行某种守护程序进程(如httpd)。在这种情况下,只要httpd守护进程正在运行,容器就会保持活动状态。

您似乎想要做的是在容器内部没有运行守护进程的情况下保持容器的活动状态。这有点奇怪(因为在您与容器交互之前,容器不会做任何有用的事情,可能是与docker exec交互),但在某些情况下,这样做可能是有意义的。

(您的意思是到达容器内的bash提示符吗?这很简单!docker run -it centos:latest)

解决方案

让容器无限期地处于守护进程模式下的一种简单方法是作为容器的命令运行sleep infinity。这并不依赖于做一些奇怪的事情,比如在守护模式下分配一个TTY。尽管它确实依赖于做一些奇怪的事情,比如使用sleep作为主要命令。

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

替代解决方案

正如cjsimon所指出的,-t选项分配一个“伪tty”。这会导致它继续无限期地运行,因为它认为它连接到一个交互式的TTY (即使如果你不通过-i就无法与那个特定的TTY进行交互)。无论如何,下面的代码也应该能起到作用:

$ docker run -t -d centos:latest

不能100%确定-t是否会产生其他奇怪的交互;如果会,请在下面留下评论。

票数 67
EN

Stack Overflow用户

发布于 2015-05-13 16:50:41

这个问题是因为如果容器中没有正在运行的应用程序,那么docker容器就会退出。

-d 

选项就是在守护模式下运行一个容器。

因此,让您容器持续运行的诀窍是指向docker中的一个外壳文件,该文件将使您的应用程序running.You可以尝试使用start.sh文件

Eg: docker run -d centos sh /yourlocation/start.sh

这个start.sh应该指向一个永不结束的应用程序。

如果您不想让任何应用程序运行,您可以安装monit,它将使您的停靠容器保持运行。请让我们知道这两个案例是否适用于您保持您的容器运行。

万事如意

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30209776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档