如何保持启动服务后运行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]

它会告诉你为什么容器停止。在我的情况下,它显示: 权限被拒绝