Docker容器将在"docker run -d"后自动停止

J J*_*ohn 277 docker

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

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Run Code Online (Sandbox Code Playgroud)

但如果我跑" 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
Run Code Online (Sandbox Code Playgroud)

我做错了什么?我该如何解决这个问题?

Von*_*onC 429

CentOS的dockerfile有一个默认的命令bash.

这意味着,当在background(-d)中运行时,shell会立即退出.

2017年更新

最近泊坞窗授权版本都运行在一个容器分离模式 ,并前台模式(-t,-i-it)

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

docker run -t -d centos
Run Code Online (Sandbox Code Playgroud)

bash将在后台等待.
这最初是在kalyani-chaudhari回答中报道的,并在泽西豆回答中详细说明.

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
Run Code Online (Sandbox Code Playgroud)

原始答案(2015)

本文所述:

建议使用docker run -t -d alpine/git,而不是运行,docker run --entrypoint "/bin/sh" -it alpine/git因为您可以只使用一个命令运行容器,而不需要通过按Ctrl+ P+ 来分离容器的终端Q.

但是,docker run -i -t image your-command选项存在问题.除非命令未在前台运行,否则容器会立即停止.
Docker要求您的命令继续在前台运行.否则,它认为您的应用程序停止并关闭容器.

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

在这种情况下,您可以添加-d到您的命令.
通过这样做,即使您的主命令在后台运行,您的容器也不会停止,因为尾部在前台继续运行.

这样可行:

docker run -d centos tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

A -d会显示centos容器仍在运行.

从那里,你可以附加它或从它(或tail -f /dev/null一些命令)分离.

  • 这可行,但不是有点hacky? (16认同)
  • @GuruprasadGV这是预期的.而不是使用docker attach,使用`docker exec -it <yourContainer> bash`. (5认同)
  • 如果在入口点文件的末尾添加tail命令,这也有效. (3认同)
  • 我使用sshd作为我的最后一个(长时间运行)命令.然后,您可以像在VM上一样ssh on the container(一旦设置.ssh/authorized_keys等)...您还可以继续使用ansible配置容器. (2认同)

cjs*_*mon 53

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

docker run -t -d <image> <command>
Run Code Online (Sandbox Code Playgroud)

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

  • 尼斯.看起来不像附加`tail -f/dev/null`那样hacky (9认同)
  • `docker run -t -d --name mysql -p 3306:3306 mysql`-对我不起作用(ubuntu 14.04.5):STATUS =已退出(1)4秒前 (2认同)

mka*_*erg 34

背景

Docker容器运行一个使其保持活动状态的进程("命令"或"入口点").只要命令继续运行,容器将继续运行.

在您的情况下,命令(/bin/bash默认情况下,打开centos:latest)立即退出(正如bash没有连接到终端并且无法运行时).

通常,当您以守护进程模式运行容器(with -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
Run Code Online (Sandbox Code Playgroud)

替代方案

如cjsimon所示,该-t选项分配"伪tty".这会让bash继续无限期地运行,因为它认为它连接到交互式TTY(即使你没有通过也无法与特定的TTY交互-i).无论如何,这应该也可以解决问题:

$ docker run -t -d centos:latest
Run Code Online (Sandbox Code Playgroud)

不是100%肯定是否-t会产生其他奇怪的互动; 如果有,可以在下面留言.

  • 请注意,这在 alpine 上不起作用,因为 BusyBox 的 sleep 不接受 `infinity`。 (3认同)

小智 17

您好这个问题是因为如果容器中没有正在运行的应用程序,则docker容器会退出.

-d 
Run Code Online (Sandbox Code Playgroud)

选项只是以deamon模式运行容器.

因此,使容器持续运行的技巧是指向docker中的shell文件,它将使您的应用程序保持运行.您可以尝试使用start.sh文件

Eg: docker run -d centos sh /yourlocation/start.sh
Run Code Online (Sandbox Code Playgroud)

这个start.sh应该指向一个永无止境的应用程序.

如果您不希望任何应用程序运行,您可以安装monit哪个将使您的docker容器保持运行.请告知我们这两个案例是否适合您保持容器运行.

祝一切顺利


jer*_*ean 12

你可以用以下两种方法完成你想要的:

docker run -t -d <image-name>
Run Code Online (Sandbox Code Playgroud)

要么

docker run -i -d <image-name>
Run Code Online (Sandbox Code Playgroud)

要么

docker run -it -d <image-name>
Run Code Online (Sandbox Code Playgroud)

其他答案(即tail -f/dev/null)建议的命令参数是完全可选的,并且不需要让容器在后台运行.

另请注意,Docker文档建议组合-i和-t选项将使其行为类似于shell.

看到:

https://docs.docker.com/engine/reference/run/#foreground


kal*_*ari 7

执行命令如下:

docker run -t -d <image-name>
Run Code Online (Sandbox Code Playgroud)

如果要指定port,则命令如下:

docker run -t -d -p <port-no> <image-name>
Run Code Online (Sandbox Code Playgroud)

使用以下命令验证正在运行的容器:

docker ps
Run Code Online (Sandbox Code Playgroud)


小智 7

如果里面的任务完成,Docker 容器就会退出,所以如果你想让它保持活动状态,即使它没有任何工作或已经完成,你可以做docker run -di image. 完成后,docker container ls您将看到它正在运行。


Bin*_*ati 6

我从ENTRYPOINTdocker文件中运行了以下代码段:

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

将构建的docker映像运行为:

docker run -td <image name>
Run Code Online (Sandbox Code Playgroud)

登录到容器外壳:

docker exec -it <container id> /bin/bash
Run Code Online (Sandbox Code Playgroud)


Eki*_*kin 6

如果您在 Dockerfile 的末尾使用 CMD,则可以在末尾添加代码。仅当您的 docker 构建在 ubuntu 或任何可以使用 bash 的操作系统上时,这才有效。

&& /bin/bash
Run Code Online (Sandbox Code Playgroud)

简而言之,您的 Dockerfile 的结尾将如下所示。

...

CMD ls && ... && /bin/bash
Run Code Online (Sandbox Code Playgroud)

因此,如果您在运行 docker 映像后自动运行任何内容,并且当任务完成时,bash 终端将在 docker 内处于活动状态。因此,您可以输入 shell 命令。


Pei*_* Hu 5

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

因此,如果您的docker entry脚本是一个如下所示的后台进程:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &
Run Code Online (Sandbox Code Playgroud)

如果以后没有其他前台进程触发,则'&'使容器停止并退出。因此解决方案是删除'&'或在其后运行另一个前台CMD,例如

tail -f server.log
Run Code Online (Sandbox Code Playgroud)


ste*_*7vt 5

也许这只是我的问题,但在 CentOS 7.3.1611 和 Docker 1.12.6 上,但我最终不得不使用 @VonC 和 @Christopher Simon 发布的答案的组合来使其可靠地工作。在此之前我所做的任何事情都不会阻止容器在成功运行 CMD 后退出。我正在启动 oracle-xe-11Gr2 和 sshd。

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

然后添加-d -t和-i来运行

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 
Run Code Online (Sandbox Code Playgroud)

最后,在我把头撞到墙上几个小时之后

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,如果删除 tail -f 或省略任何 -t -d -i 选项,则执行 CMD 后上述内容将退出。


归档时间:

查看次数:

328276 次

最近记录:

6 年,4 月 前