Docker容器运行多条命令(supervisor)

Docker与Supervisor日志问题解决
本文介绍在Docker环境下使用Supervisor管理多进程时遇到的日志输出问题及解决方案。通过修改Supervisor配置,将Django和Celery的日志重定向至标准输出,实现日志的有效收集。

 

一, 简介

Dockerfile 运行只支持一条命令,当在Docker里要运行多条命令,用supervisor来管理就比较合适了。
Supervisor是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程。它可以同时启动,关闭多个进程,使用起来特别的方便。

组成部分

supervisor 主要由两部分组成:

  1. supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等;
  2. supervisorctl(client 部分):命令行客户端,用户可以通过它与不同的 supervisord 进程联系,获取子进程的状态等。

二,存在的问题——日志不输出

但是使用supervisor,Django运行的日志就不会在Docker里输出了,默认的输出如下:

2018-03-28 06:48:20,292 CRIT Supervisor running as root (no user in config file)
2018-03-28 06:48:20,308 INFO supervisord started with pid 1
2018-03-28 06:48:21,310 INFO spawned: 'celery_beat' with pid 7
2018-03-28 06:48:21,312 INFO spawned: 'celery_worker' with pid 8
2018-03-28 06:48:21,313 INFO spawned: 'django' with pid 9
2018-03-28 06:48:22,315 INFO success: celery_beat entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-03-28 06:48:22,315 INFO success: celery_worker entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-03-28 06:48:22,315 INFO success: django entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

上面的Docker中supervisor配置如下:

[supervisord]
nodaemon=true
 
[program:django]
command=python manage.py runserver 0.0.0.0:8080
 
[program:celery_worker]
command=python manage.py celery worker -c 4 -l info
 
[program:celery_beat]
command=python manage.py celery beat

这样的配置在容器中是同时运行Django,celery。

三,解决方案

1,改进后的配置方案

[inet_http_server]
port=9001
username=abc
password=123456
 
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
 
[program:django]
command=python manage.py runserver 0.0.0.0:8080
#stdout_logfile = /var/log/supervisord/django_stdout.log
loglevel=info
redirect_stderr=true
 
[program:celery_worker]
command=python manage.py celery worker -c 4 -l info
loglevel=info
redirect_stderr=true
 
[program:celery_beat]
command=python manage.py celery beat
loglevel=info
redirect_stderr=true

实测发现Django的日志输出会写到stderr.log文件中,所以在配置文件中将错误日志重定向到标准日志里;

redirect_stderr=true

容器中的生成的日志文件如下:

root@a16bc77e96bc:/var/log/supervisor# ls
celery_beat-stderr---supervisor-rSPQ7E.log    django-stderr---supervisor-9LS_KA.log
celery_beat-stdout---supervisor-t5Q4UI.log    django-stdout---supervisor-cTSBmq.log
celery_worker-stderr---supervisor-TRFzc7.log  supervisord.log
celery_worker-stdout---supervisor-xNgeBU.log

2,查看日志

运行容器时,将9001端口映射出去,通过ip:9001访问:
[图片上传失败...(image-20da97-1522375135673)]

点击 Tail -f 查看各个进程的日志。

参考

http://debugo.com/docker-supervisord/

http://blog.youkuaiyun.com/zhousenshan/article/details/52988885

supervisor配置

作者博客:http://kekefund.com/2018/03/30/supervisor/



 

### 在 Docker 中使用 Supervisor 管理多个进程的最佳实践 #### 安装并配置 Supervisor 为了在 Docker 容器内有效管理多个进程,通常会选择安装 `supervisor` 作为进程管理工具。这允许更精细地控制各个服务的状态以及它们之间的依赖关系。 对于基于 Debian 或 Ubuntu 的镜像,可以通过以下命令来安装 `supervisor`: ```bash RUN apt-get update && \ apt-get install -y supervisor && \ mkdir -p /var/log/supervisor ``` 创建一个基本的 `supervisord.conf` 文件用于定义哪些程序应该被监控和自动重启策略等参数[^1]。 #### 配置 Supervisord Conf 文件 在一个典型的多进程场景下,比如同时运行 Nginx 和 PHP-FPM,在构建自定义 Dockerfile 时可以这样指定 `CMD` 命令以启动 supervisord 并加载配置文件: ```dockerfile COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord"] ``` 其中 `supervisord.conf` 应该至少包含如下内容以便于管理和监督不同类型的后台任务或守护进程[^3]: ```ini [supervisord] nodaemon=true [program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true stderr_logfile=/var/log/nginx/error.log stdout_logfile=/var/log/nginx/access.log [program:php-fpm] command=php-fpm --nodaemonize --fpm-config /usr/local/etc/php-fpm.conf autostart=true autorestart=true stderr_logfile=/proc/self/fd/2 stdout_logfile=/proc/self/fd/1 ``` 上述配置确保了即使某个组件意外终止也能由 `supervisor` 自动恢复其正常工作状态;同时也方便开发者通过简单的 shell 命令进入正在运行中的容器内部查看当前有哪些服务处于活动之中[^2]。 #### 进入容器检查 Supervisor 状态 一旦应用已经部署完毕并且容器已经开始执行,则可通过下面这条指令连接到目标实例当中去进一步操作: ```bash docker exec -it <container_name> /bin/bash ``` 接着就可以利用 `supervisorctl` 工具查询所有受管项目的健康状况或是手动干预特定的服务实例了: ```bash supervisorctl status ``` 此命令会返回一系列有关各子系统的最新信息,包括但不限于是否在线、最近一次切换时间戳等等有用的数据点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值