根据我目前阅读的教程,使用"docker run -d"将从image启动一个容器,并且容器将在后台运行。这就是它的样子,我们已经有了container 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

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


当前回答

如果你在Dockerfile的末尾使用CMD,你所能做的就是在末尾添加代码。只有当你的docker构建在ubuntu上,或者任何可以使用bash的操作系统上时,这才会起作用。

&& /bin/bash

简单地说,Dockerfile的结尾看起来像这样。

...

CMD ls && ... && /bin/bash

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

其他回答

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

论证顺序很重要

Jersey Beans的答案(所有3个例子)对我很有用。经过相当多的尝试和错误之后,我意识到论点的顺序很重要。

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

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

对于我这种拥有Powershell背景的人来说,这一点并不明显。

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

Sudo docker logs -f >> container.log

此外,您还可以使用——details来显示提供给日志的额外详细信息。

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

-d 

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

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

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

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

如果你不想让任何应用程序运行,你可以安装monit来保持docker容器运行。 请让我们知道这两个案例是否对你的集装箱运行有效。

愿一切都好!

Dockerfile中应用程序的错误路径:

我正在使用Alpine Linux将应用程序从RHEL服务器迁移到Docker容器。

在构建过程中没有错误,所以我很惊讶地看到容器立即退出!

第一停靠港:

docker logs <containerID>

这揭示了我在Dockerfile中提供给CMD的二进制文件的路径是伪造的:

line 0: /sbin/postfix: not found

好吧,这告诉了我事情是如何被破坏的,但没有具体到哪里:我仍然需要在Alpine Linux中为二进制文件提供正确的路径……

故障排除:

谷歌没有显示它的正确路径,所以我添加了以下一行到我的Dockerfile:

RUN which postfix

然后,我检查了我的构建日志记录(由附加到构建命令的下面命令提供),以检索RUN的值

 --progress=plain > /path/to/build.log 2>&1

解决办法:

我删除了这个测试构建,在Dockerfile中提供了正确的路径- /usr/sbin/postfix -到CMD,删除了该后缀的RUN,并运行了另一个构建。

瞧;这个过程现在还没有结束。

所以duff路径导致容器立即退出…