使用supervisord在同一个容器中管理多个进程
如果一个项目有多个主进程,通常建议一个容器负责一个主进程,如果单个进程出问题,可以重启单个容器恢复,
如果要在一个容器中启动多个进程,可以写在command中,但是如果其中一个进程出问题,就要重启容器解决,
如果使用supervisord在同一个容器里管理多个进程,可以自动管理每个进程,当进程挂掉时,自动重启这个进程。
需要在编写supervisord.conf,格式如下:
plaintext
[supervisord]
nodaemon=true
user=root
logfile=/dev/null
pidfile=/tmp/supervisord.pid
[program:mosquitto]
command=mosquitto -c /mosquitto/config/mosquitto.conf
autostart=true
autorestart=true
priority=10
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0
[program:worker]
command=php /app/worker/mqtt_worker.php
autostart=true
autorestart=true
priority=20
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0
[program:app]
command=php -S 0.0.0.0:8000 /app/router.php
autostart=true
autorestart=true
priority=30
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0在dockerfile中,把配置文件复制到/etc/supervisor/conf.d/supervisord.conf
示例:
plaintext
FROM php:8.2-cli
WORKDIR /app
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
libfreetype6-dev \
libjpeg-dev \
libpng-dev \
libonig-dev \
libsqlite3-dev \
supervisor \
mosquitto; \
docker-php-ext-configure gd --with-freetype --with-jpeg; \
docker-php-ext-install -j$(nproc) pdo_sqlite mbstring gd; \
rm -rf /var/lib/apt/lists/*
COPY . /app
RUN set -eux; \
mkdir -p /app/storage /app/users/upload/avatars /app/users/upload/records /app/users/upload/banner /app/runtime; \
chmod -R 0777 /app/storage /app/uploads /app/runtime; \
mkdir -p /mosquitto/config /mosquitto/data /var/log/supervisor
COPY mosquitto.conf /mosquitto/config/mosquitto.conf
# 引入supervisord
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 8000 1883
CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"]