Docker 中使用 supervisor 并前台输出日志

在 Docker 环境下使用 supervisor 遇到的问题记录。

前言

今天在部署 php-fpm 的 Docker 容器的时候,由于其他应用用到了 supervisor,记录一下基本的配置流程,以及将程序日志输出到 Docker 日志的方法。

配置

首先是安装,在 Dockerfile 直接用 apt 安装即可。注意由于最后需要用 CMD 启动 supervisor ,所以需要把 php-fpm 的启动方式也改成 supervisor 守护。

Dockerfile 同目录下创建 supervisord.conf,内容为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[supervisord]
nodaemon=true
user=root

[program:php-fpm]
command = /usr/local/sbin/php-fpm
process_name=%(program_name)s
autostart=true
autorestart=true
startretries=5
exitcodes=0,2,70
stopsignal=QUIT
stopwaitsecs=2

然后在 Dockerfile 中进行相应配置:

1
2
3
4
5
6
7
8
FROM php:8.0-fpm

RUN apt update \
    && apt install -y git zip unzip supervisor

COPY supervisord.conf /etc/supervisor/conf.d/

CMD ["/usr/bin/supervisord","-n"]

这样就可以使用了,但是问题是 php-fpm 的日志不会输出到 Docker 的日志,查看起来非常不方便,可以通过将日志流输出到/dev/stdout来解决,具体做法是在 supervisord.conf 中需要输出日志的 program 段中添加如下内容:

1
2
3
4
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

完整的 supervisord.conf 文件如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[supervisord]
nodaemon=true
user=root

[program:php-fpm]
command = /usr/local/sbin/php-fpm
process_name=%(program_name)s
autostart=true
autorestart=true
startretries=5
exitcodes=0,2,70
stopsignal=QUIT
stopwaitsecs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

参考资料

Docker, Supervisord and logging - how to consolidate logs in docker logs?

0%