如何保持启动服务后运行Docker容器?
我见过一堆教程,似乎做同样的事情,我想做的,但由于某种原因,我的Docker容器退出。 基本上,我在Docker容器中设置了一个web服务器和一些守护进程。 我通过一个名为run-all.sh
的bash脚本来完成这个最后的部分,我在Dockerfile中通过CMD运行。 run-all.sh
看起来像这样:
service supervisor start service nginx start
我在Dockerfile中启动它,如下所示:
CMD ["sh", "/root/credentialize_and_run.sh"]
我可以看到,所有的服务都是在我手动运行的时候正常启动的(比如用-i -t / bin / bash进入镜像),当我运行镜像的时候,所有的东西看起来都是正确的,它完成启动我的过程。 我希望进程无限期地运行,据我所知,容器必须继续运行。 不过,当我运行docker ps -a
,我看到:
➜ docker_test docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
是什么赋予了? 它为什么退出? 我知道我可以在我的bash脚本的最后加上一个while循环来保持它,但是保持它不会退出的正确方法是什么?
这不是真的应该如何devise你的Docker容器。
在devise一个Docker容器的时候,你应该构build它,这样只有一个进程正在运行(例如,你应该有一个用于Nginx的容器,一个用于supervisord或运行的应用程序)。 另外,这个过程应该在前台运行。
当进程本身退出时,容器将“退出”(在你的情况下,这个过程就是你的bash脚本)。
然而,如果你真的需要(或者想要)在你的Docker容器中运行多个服务,可以考虑从“Docker Base Image”开始 ,它使用runit
作为伪init进程( runit
将保持联机,而Nginx和Supervisor运行),将保持在前台,而你的其他进程做他们的事情。
他们有大量的文档,所以你应该能够很容易地实现你想要做的事情。
我只是遇到同样的问题,我发现如果你用-t
和-d
标志运行你的容器,它将继续运行。
docker run -td <image>
这是旗帜(根据docker run --help
):
-d, --detach=false Run container in background and print container ID -t, --tty=false Allocate a pseudo-TTY
最重要的是-t
标志。 -d
只是让你在后台运行容器。
它退出的原因是因为shell脚本首先作为PID 1运行,当完成时,PID 1消失,而docker只在PID 1运行时运行。
如果使用“-n”标志运行,它会被告知不要守护进程,所以它可以保持第一个进程:
CMD ["/usr/bin/supervisord", "-n"]
和你的supervisord.conf:
[supervisord] nodaemon=true [program:startup] priority=1 command=/root/credentialize_and_run.sh stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=false startsecs=0 [program:nginx] priority=10 command=nginx -g "daemon off;" stdout_logfile=/var/log/supervisor/nginx.log stderr_logfile=/var/log/supervisor/nginx.log autorestart=true
然后,您可以拥有任意数量的进程,如果需要,主pipe将处理其重新启动。
这样,你可以使用supervisord的情况下,你可能需要nginx和php5-fpm,没有多大意义,让他们分开。
只需使用tail -F -n0 /etc/hosts
或其他东西
只要你不停止它,它将保持你的容器运行
如果您正在使用Dockerfile,请尝试:
ENTRYPOINT ["tail", "-f", "/dev/null"]
(显然这只是为了开发的目的,你不应该需要保持一个容器活着,除非它运行一个进程,例如nginx …)
确保你daemon off;
给你nginx.conf或运行CMD ["nginx", "-g", "daemon off;"]
根据官方nginx图像
然后使用以下命令将supervisor作为service和nginx作为前台进程运行,以防止容器退出
service supervisor start && nginx
在某些情况下,您需要在容器中包含多个进程,因此强制容器只有一个进程将无法工作,并可能在部署中创build更多的问题。
所以你需要了解这些权衡,并相应地做出决定。
我有同样的问题。你可以尝试这个命令: docker logs [container]
它会告诉你为什么容器停止。在我的情况下,它显示: 权限被拒绝