制作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://blog.csdn.net/wawa8899/article/details/52743861>
https://www.linuxidc.com/Linux/2017-02/140417.htm
<https://www.linuxidc.com/Linux/2017-02/140417.htm>
热门工具 换一换