如果一个项目有多个主进程,通常建议一个容器负责一个主进程,如果单个进程出问题,可以重启单个容器恢复,

如果要在一个容器中启动多个进程,可以写在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"]