我想自动运行多个容器并创建一些东西,
但是某些图像(如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'什么都不显示,我试着通过键入:
来构建DockerfileFROM 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容器继续运行..?
(抱歉,我的英语不好))
答案 0 :(得分:7)
首先,您不希望混合使用-i
和-d
个开关。要么以交互模式或分离模式运行容器。在你的情况下处于分离模式:
docker run -d swarm /bin/bash tail -f /dev/null
也不需要使用-t
标志分配tty,因为这只需要在交互模式下完成。
您应该查看Docker run reference
答案 1 :(得分:5)
但是,-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容器,选项很少。
docker run -it <image> /bin/bash
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图像。
之后我明白我们只使用图片中的五个命令来运行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'