制作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

安装的目录是/usr/local/Cellar/ supervisor cd到/usr/local/etc 这个目录下有个 supervisor d.ini 的原配置文件,把这个配置文件复制一份 ,修改名字是 supervisor d.conf 根据上面的截图的最后一行 在/usr/local/etc/的目录下创建 supervisor .d目录 并这个目录中写入自己 定义的配置文件 例如:atlas.conf 执行指令: supervisor ctl restart group-xxx: 一直没返回; 查看所重启服务组的进程: supervisor ctl status group-xxx: 发现有一个处于 STOPPING状态,其他都是STOPED; 查询进程状态:ps -ef|grep xxx, 发现进程还活着; cat /proc/'进程pid' status, 发现进程状态是D
先在Linux中安装 docker ,然后在 docker 中安装appnode,并进行 docker 网络端口映射。接着登录appnode面板安装 supervisor supervisor 用于守护进程,在进程意外终止后将其重启。 supervisor 没有监听内部 程序 和自动重启的功能。
在上一篇文章 <<为什么需要自定义一个基础镜像?>> 介绍如何 实现 一个php基础镜像,我们在PHP官方镜像之上,添加一些项目必用的php扩展模块,并且安装了 nginx、 supervisor 软件,接下来本篇文章中介绍 如何使用 supervisor 容器 中运行与管理 nginx 与 php-fpm 进程(多进程)。 默认情况下 docker 容器 只运行单个进...
注:本文基于CentOS 6.6 Docker 容器 的设计并不推荐 容器 内运行多个进程,它希望的是一个进程一个 容器 ,走微服务方向。然而实际生产过程中并没有这么理想,总是会有需要多个进程运行在同一 容器 的需要。因此,我们今天来介绍一下 容器 内的多进程管理—— supervisor ,还有另一个工具——monit,同样可以用于 容器 内多进程管理,不过我们后面再介绍它。 1、使用yum方式 yum ins...
可通过easy install supervisor 或pip install supervisor ,当然还可以通过下载源码通过python setup.py install 来安装(注意:要在python2.x下进行安装) 还可以通过linxu下的包管理来安装,如yum install supervisor
问题描述:在编写 Docker file创建 supervisor 容器 时,最后一条 启动 supervisor 的命令不起作用 -> CMD [" supervisor d","-c","/etc/ supervisor d.conf"],但是进到 容器 内部执行 supervisor d -c/etc/ supervisor d.conf可以成功运行。 先贴出来 Docker file文件代码 FROM python...
systemd是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此 实现 系统初始化时服务的并行 启动 ,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init 程序 。    传统的System V是串行 启动 ,即在