如何让docker容器保持运行?

时间:2017-08-02 12:45:03

标签: docker containers

我想自动运行多个容器并创建一些东西,

但是某些图像(如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容器继续运行..?

(抱歉,我的英语不好))

6 个答案:

答案 0 :(得分:7)

首先,您不希望混合使用-i-d个开关。要么以交互模式或分离模式运行容器。在你的情况下处于分离模式:

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

也不需要使用-t标志分配tty,因为这只需要在交互模式下完成。

您应该查看Docker run reference

答案 1 :(得分:5)

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

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

问题是某些应用程序无法在前台运行。

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

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

docker ps 显示容器

现在,您可以使用 docker exec container_name命令

附加容器

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

答案 2 :(得分:1)

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

要在后台运行Docker容器,选项很少。

  1. 使用shell运行。 docker run -it <image> /bin/bash
  2. 用于连续运行的容器。 docker run -d -p 8080:8080 <image>。假设映像将公开端口8080并处于侦听模式。

答案 3 :(得分:0)

你是对的 docker run -itd swarm (没有给容器的参数(bash -c“而为true; do sleep 1; done”))工作正常。如果你传递了docker run的参数它将运行命令并终止容器。如果要永久运行容器,首先使用 docker run -itd swarm 启动容器,然后通过 docker ps <检查容器是否运行/ strong>现在容器运行,如果要在容器中执行任何命令,请使用 docker exec -itd container_name命令记住:仅使用不停止容器的命令。 bash -c“而为true;执行sleep 1;完成此命令将停止容器(因为这是完整的命令,如果我们在普通终端执行它执行和终止,这种类型的命令也会终止容器)。

我希望这有助于......

答案 4 :(得分:0)

基本上这是方法,但你的码头图像是群体,所以它是不同的,我不知道swarm docker图像,我不使用它。但我研究之后。首先,我运行它显示的docker swarm图像。

enter image description here

之后我明白我们只使用图片中的五个命令来运行docker swarm图像,如create,list manage,join,help。如果我们在没有像 docker run -itd swarm 这样的命令的情况下运行swarm图像,则将命令作为--help。对不起,但我不知道群体图像的目的是什么。有关更多用法,请查看https://hub.docker.com/_/swarm/

我添加 docker run -itd image tail -f / dev / null 的答案不适用于swarm图像,它适用于像ubuntu,fedora,centos这样的泊坞窗图像。

只需阅读swarm图像的用法及其使用原因。

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

中发布您的问题

谢谢......

答案 5 :(得分:0)

在/ dev / null上拖尾是可以的,但是为什么不让它做一些有用的事情呢?

以下命令将获得孤立进程,因此不会留下僵尸(已失效)进程。另外,某些init.d /重新启动脚本也不允许这样做。

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