Supervisor实现Docker容器启动后不退出

  制作Docker镜像时一般会使用ENTRYPOINT来配置容器启动时执行的命令,一般用于启动一些服务。但是命令运行结束后,容器也会结束,会发现刚起的容器Exit(0)。一般可以用 ENTRYPOINT ["/sbin/init" ] 来实现容器起来后不退出,而是继续运行,但是想配置有些服务也跟着容器启动而启动则有些困难。也有一个老土的办法,进入运行的容器去启动我们想要的服务。但是,现在可以使用Supervisor来实现我们想要的功能。
  
  Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。


Centos7安装Supervisor

yum install -y epel-release
yum install -y supervisor

  安装后默认配置文件:/etc/supervisord.conf,进程管理配置文件目录:/etc/supervisord.d/
  默认supervisord的启动方式是daemon,即后台方式启动,因此要配置为前台启动,修改配置文件/etc/supervisord.conf中supervisord项的nodaemon属性值为true:sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf

关于进程管理的配置,格式如下:

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:nginx]
command = /www/lanmps/bin/nginx start   ; 程序启动命令
autostart = true                        ; 在 supervisord 启动的时候也自动启动
startsecs = 5                           ; 启动 5 秒后没有异常退出,就表示进程正常启动了
autorestart = true                      ; 程序异常退出后自动重启
                                        ; 可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries = 3                        ; 启动失败自动重试次数,默认是 3
user = www                              ; 用哪个用户启动,默认是root
priority=1                              ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr = true                  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB          ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20             ; stdout 日志文件备份数,默认是10
stdout_logfile = /www/center.log        ; stdout 日志文件,需要当目录不存在时无法正常启动
stopasgroup=false                       ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false                       ;默认为false,向进程组发送kill信号,包括子进程

  进程管理配置可以在supervisord.conf文件中配置,但是不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在supervisord.conf文件中指定的include目录:

[include]
files = supervisord.d/*.ini

  也就是说自定义配置文件放在/etc/supervisord.d目录,并以.ini为后缀。

  Dockerfile中ENTRYPOINT相关配置如下:
  ENTRYPOINT ["/usr/bin/supervisord" , "-c" , "/etc/supervisord.conf"]
  这样当容器通过 docker run –d imageid 启动后就不会退出,同时也会启动自定义的进程。

参考:
https://blog.csdn.net/wawa8899/article/details/52743861
https://www.linuxidc.com/Linux/2017-02/140417.htm

你可能感兴趣的:(docker)