使用 docker-compose + supervisor 管理go的job
supervisor 的配置文件示例如下:
[program:xxx] process_name=%(program_name)s_%(process_num)02d command=gocommand xxx --config xxx.yml directory=/var/www/program #工作目录,定义工作目录是为了日志路径可以保证在项目目录下 autostart=true #自动启动 autorestart=true #自动重启 numprocs=1 #只有一个进程 stdout_logfile=/var/log/xxx.log #标准输出日志文件 stderr_logfile=/var/log/xxx_stderr.log #错误输入日志文件 redirect_stderr=true #重定向错误日志 stdout_logfile_maxbytes = 50MB #日志文件大小 stdout_logfile_backups = 20 #日志文件保留数量 stopsignal=INT #以SIGINT (信号2)通知进程结束 stopwaitsecs=6000 #等待进程结束时间,超过这个时间则强制杀死进程,默认10s
go 中代码如下:
quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, os.Kill) <-quit fmt.Println("监控到退出信号")
最后是docker-compose 通知 supervisor 重启,
supervisor: restart: always stop_grace_period: 6000s #等待时间,超过这个时间则强制杀死容器,默认10秒 build: context: ./supervisor volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} networks: - backend