Docker容器在运行"docker run -d"命令后会自动停止

562

根据我迄今为止阅读的教程,使用"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

我有做错什么吗?如何排除这个问题?


2
"docker run hello-world" <== 运行正常,但如果我运行 "docker run -d hello-world",我仍然无法获得正在运行的容器。 - J John
9
我之前也遇到了类似的问题,但是我通过使用 docker run -it -d <image> /bin/bash 解决了它。这个命令会启动一个交互式的bash shell,并且不会关闭容器,因为bash shell进程在活动状态。 - Rtsne42
23个回答

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

然后加上-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 

终于,在长时间的挣扎之后,我终于解决了问题。

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

出现上述情况的原因可能是由于移除了tail -f或省略了-t -d -i选项之一,导致CMD在执行后退出。


3

问题的快速解答:

只需执行以下命令:

docker run -d image_name sleep infinity

请参见下面的图片:

enter image description here

什么是sleep infinity,它是如何工作的?

Sleep命令是Unix命令,会使shell等待一定量的时间。

sleep infinity命令是在Docker中使用的,用于无限期地保持容器运行。在Docker中运行容器时,它会执行您在容器中指定的命令,一旦命令完成,容器就会退出。如果您希望即使命令已完成后仍然保持容器运行,可以使用sleep infinity命令。


3
您可以简单地使用以下代码:
docker container run -d -it <container name or id> /bin/bash

对我来说,这个命令需要一个图像名称,所以它无法工作。 - Kureteiyu

2

使用交互模式运行docker可能会解决问题。

以下是带有和不带有交互模式的镜像运行示例:

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3d6a9529fd7 test_again1.0 "bash" 2秒前 Up 1秒 awesome_haibt


2
我遇到了同样的问题,只需在另一个带有Bash的终端中打开即可解决:

创建容器:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

start container:

docker start 52bbc9b30557

start bash to keep container running:

docker exec -it 52bbc9b30557 bash

最初的回答
开始处理需要以下步骤:
docker exec -it 52bbc9b30557 /path_to_cool_your_app

1

0

我也遇到了同样的问题,但是情况有所不同。当我创建Docker容器时,它会自动停止那些仅在后台运行的未使用容器。有时它也会停止正在使用的容器。 在我的情况下,这是由于之前docker.sock文件的权限问题引起的。 你需要做的是:

  1. 重新安装Docker。(因为我使用的是Ubuntu,所以我从这里安装)

  2. 运行以下命令更改权限。

    sudo chmod 666 /var/run/docker.sock

  3. 安装docker-compose(这是可选的,因为我有一个compose文件可以创建多个容器)

    sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    sudo chmod +x /usr/local/bin/docker-compose

  4. 检查版本以确保我拥有最新版本,不会遇到一些已弃用的问题。

  5. 然后我运行Docker容器构建。


0

参数顺序很重要

Jersey Beans的答案(所有3个示例)对我有用。经过相当多的试错,我意识到参数的顺序很重要。

在后台保持容器运行: docker run -t -d <image-name>

在前台保持容器运行:docker run <image-name> -t -d

对于我来说,这并不明显,因为我来自Powershell背景。


-1

如果你想对容器进行操作,你需要在前台运行它以保持其活动状态。


-1

有多种选项可以在前台/后台状态下运行容器。但如果您仍然觉得问题没有解决,您可以尝试通过查看日志来排除故障。

sudo docker logs -f >> container.log

此外,您还可以使用--details来显示提供给日志的额外细节。


这不是内部问题或错误。问题似乎与OP用于运行容器的命令相关,因为它退出了,原因可能是它没有运行应用程序和/或没有等待用户输入。那么,如何显示日志值将有助于解决这个问题呢? - abestrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接