如何保持Docker容器运行?

19
我想要自动运行多个容器并创建一些东西,
但是有些镜像,比如swarm,在运行或启动后会自动停止。
我已经尝试过这样做了。
docker run -d swarm

docker run -d swarm /bin/bash tail -f /dev/null

docker run -itd swarm bash -c "while true; do sleep 1; done"

但是 'docker ps' 没有显示任何内容,我尝试通过输入以下命令来构建 Dockerfile:
FROM swarm
ENTRYPOINT ["echo"]

图片无法运行,显示错误信息。
docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"echo\\\": executable file not found in $PATH\"\n".

我无法理解这个错误... 怎样才能保持Swarm容器运行呢..?
(抱歉,我的英文不好))
7个回答

13

建议使用-d,因为您可以仅使用一个命令运行容器,而不需要通过按下Ctrl + P + Q来分离容器的终端。

但是,-d选项存在问题。除非命令在前台运行,否则您的容器将立即停止。 Docker要求您的命令在前台持续运行。否则,它会认为您的应用程序已停止并关闭容器。

问题在于某些应用程序不能在前台运行。

在这种情况下,您可以将tail -f /dev/null添加到您的命令中。 通过这样做,即使您的主要命令在后台运行,因为tail仍在前台运行,所以您的容器也不会停止。

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

docker ps会显示容器

现在,您可以使用docker exec container_name command附加到容器

或者

docker run -d swarm command tail -f /dev/null


根据您的指示,我尝试了这个命令,但容器仍然无法保持运行状态。如果可能的话,您能否确认当Swarm镜像使用该命令运行时,容器是否显示在docker ps中?我想检查一下我的服务器是否有问题...在等待答案的同时,我使用Dockerfile进行了简单的测试,并收到了错误消息。我已经更新了帖子,希望您可以参考它来解决这个问题。感谢您继续关注解决我的问题。 - haeny

11

首先,您不希望混合使用-i-d开关。要么您想在交互模式下运行容器,要么您想在分离模式下运行容器。在您的情况下,应该选择分离模式:

docker run -d swarm /bin/bash tail -f /dev/null

在非交互模式下,也无需使用-t标志来分配tty。

您应该查看Docker运行参考


1
docker ps 仍然没有显示任何内容。我需要更多地学习关于 docker run。谢谢 :) - haeny
@haeney - 你的容器已经运行起来了吗? - Cyclonecode
1
是的。其他容器,如nginx、Ubuntu和redis都可以正常运行,但是swarm将在运行时同时终止。 - haeny

3

Docker容器有两种任务类型。一种是执行并退出,另一种是在后台运行。

要在后台运行docker容器,有几个选项。

  1. 使用shell运行。docker run -it <image> /bin/bash
  2. 持续运行容器。docker run -d -p 8080:8080 <image>,假设镜像将暴露端口8080并处于监听模式。

1

在/dev/null上做一个尾部处理是可以的,但为什么不让它发挥一些有用的作用呢?

以下命令将清除孤儿进程,以便没有僵尸(defunct)进程漂浮。此外,一些init.d /重启脚本也不允许此操作。

exec sh -c 'while true ;do wait ;done'

这不是一个很好的等待命令,因为当你使用 docker container stop 停止它时,它不会干净地退出。 - Iizuki
@lizuki,“干净退出”是什么意思?我没有注意到任何不良影响。 - TheMadsen
最简单的方法是在前台运行容器,即不使用-d选项,并尝试使用ctrl + c停止它。您将会看到关于终止信号的警告。 - Iizuki
好的。谢谢您澄清。 - TheMadsen

0

你是对的,docker run -itd swarm(不给容器传递参数,即不使用)可以正常工作。如果你在docker run命令中传递参数,它将运行该命令并终止容器。如果你想永久运行容器,请首先使用docker run -itd swarm启动容器,并通过docker ps检查容器是否正在运行。现在容器正在运行,如果你想在容器中执行任何命令,请使用docker exec -itd container_name command。请记住:只使用不会停止容器的命令。 bash -c "while true; do sleep 1; done这个命令将停止容器(因为这是完整的命令,如果我们在普通终端中执行它,它会执行并终止,这种类型的命令也会终止容器)。

希望这能帮到你。


我的代码步骤如下:
  1. 图像在没有命令的情况下运行(docker run -itd swarm)。
  2. 检查“docker ps”。
  3. 如果容器没有运行, 3-1 删除容器和图像,并使用命令运行(docker run -itd swarm bash ...)。
因此,没有命令的情况下运行图像是没有效果的...
- haeny

0

基本上这是方法,但你的Docker镜像是Swarm,所以它不同,我不知道Swarm Docker镜像,也没有使用过。但在我研究之后,首先运行Docker Swarm镜像,它会显示:

enter image description here

在那之后,我了解到我们可以仅使用图片中的五个命令来运行 Docker Swarm 图像,例如创建、列出、管理、加入和帮助。如果我们不使用命令直接运行 Swarm 图像,如docker run -itd swarm,它会将命令作为 --help。对不起,但我不知道 Swarm 图像的目的是什么。要了解更多使用方法,请查看https://hub.docker.com/_/swarm/

我所提供的答案 docker run -itd image tail -f /dev/null并不适用于 Swarm 图像,而是适用于像 Ubuntu、Fedora 和 CentOS 等 Docker 图像。

只需阅读 Swarm 图像的使用说明以及其用途。

如果您遇到任何问题,请在https://github.com/docker/swarm-library-image/issues中发布您的问题。

谢谢...


我也不知道Swarm的用途。因为我的目的是从探索页面获取大量图像信息并自动提取和运行它们。但由于Swarm是一个特殊情况,我将继续下一步..只是有点棘手:(无论如何,谢谢^^ - haeny

0

有一个正在运行的容器

docker run --rm -d --name=tmp ubuntu sleep infinity

请求从休眠容器中执行命令的示例

docker exec tmp echo hello from container

注意事项:

  • --rm在容器停止时删除容器
  • -d在后台运行容器
  • --name=tmp给容器命名,这样您可以控制如何表示它
  • ubuntu推送一个轻量级映像以执行您的命令
  • sleep infinity使容器保持休眠状态

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