Ao rodar aplicações Laravel em containers Docker, o gerenciamento de processos em segundo plano, como filas e cron jobs, exige uma ferramenta robusta. O Supervisor é a solução ideal, mas sua configuração no ambiente Docker requer atenção especial às permissões e caminhos.

Este artigo apresenta um modelo de Dockerfile e arquivos de configuração para instalar e configurar o Supervisor em uma imagem base RHEL/CentOS/Rocky Linux, garantindo que seus workers do Laravel sejam gerenciados corretamente.


1ļøāƒ£ Estrutura de Arquivos Link para o cabeƧalho

Para este setup, você precisarÔ dos seguintes arquivos no diretório raiz do seu projeto antes de construir a imagem:

  • Dockerfile
  • supervisord.conf (Configuração principal do Supervisor)
  • laravel-worker.conf (Configuração do grupo de workers do Laravel)

2ļøāƒ£ O Dockerfile: Instalação e Configuração Link para o cabeƧalho

O Dockerfile é o coração da nossa imagem. Ele é responsÔvel por instalar o Supervisor e definir os usuÔrios e permissões corretas.

# Usa uma imagem base RHEL 8 ou similar
# Exemplo: rockylinux:8, centos:8, ou uma base slim
FROM rockylinux:8 as base


# Define variƔveis de ambiente
ENV APP_PATH=/app


# -----------------------------------------------------------
# Instalação de Dependências
# -----------------------------------------------------------
RUN dnf update -y && \
    # Instala o EPEL (geralmente necessƔrio para o Supervisor)
    dnf install epel-release -y && \
    # Instala o Supervisor
    dnf install supervisor -y && \
    # Limpa o cache para reduzir o tamanho da imagem
    dnf clean all


# -----------------------------------------------------------
# Configuração de UsuÔrio e Diretórios
# -----------------------------------------------------------


# Cria o usuÔrio 'nginx' (ou 'www-data', dependendo da sua base) que o PHP-FPM e os workers usarão
# Ɖ crucial que o usuĆ”rio que executa o 'artisan' tenha as permissƵes corretas.
RUN groupadd -g 1000 nginx && \
    useradd -u 1000 -ms /bin/bash -g nginx nginx


# Cria diretórios necessÔrios para logs e configurações do Supervisor
RUN mkdir -p /var/log/supervisor /etc/supervisord.d


# Define o diretório de trabalho da aplicação
WORKDIR ${APP_PATH}


# Copia a aplicação Laravel
COPY . ${APP_PATH}


# -----------------------------------------------------------
# Permissões e Inclusão de Configs
# -----------------------------------------------------------


# Copia os arquivos de configuração do Supervisor para os locais esperados
COPY supervisord.conf /etc/supervisord.conf
COPY laravel-worker.conf /etc/supervisord.d/


# Define a propriedade da aplicação e dos logs para o usuÔrio não-root
RUN chown -R nginx:nginx ${APP_PATH} \
    && chown -R nginx:nginx /var/log/supervisor \
    && chmod -R 775 /var/log/supervisor


# Define o usuƔrio que executarƔ a maioria dos comandos (workers PHP)
USER nginx


# -----------------------------------------------------------
# Comando de Inicialização
# -----------------------------------------------------------


# O comando principal que inicia o Supervisor em modo non-daemon (-n)
# O Supervisor irƔ gerenciar o PHP-FPM e os workers definidos nas configuraƧƵes.
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf", "-n"]

3ļøāƒ£ Arquivos de Configuração do Supervisor Link para o cabeƧalho

3.1 supervisord.conf (Configuração Principal) Link para o cabeçalho

Este arquivo Ʃ responsƔvel por iniciar o Supervisor e incluir as configuraƧƵes especƭficas dos seus programas.

[supervisord]
; O daemon principal roda como 'root' para ter controle total sobre o gerenciamento de processos.
user=root
logfile=/var/log/supervisor/supervisord.log 
pidfile=/var/run/supervisord.pid


; Inclui todas as configuraƧƵes dos workers do Laravel
[include]
files = /etc/supervisord.d/*.conf

3.2 laravel-worker.conf (Definição do Programa) Link para o cabeçalho

Aqui definimos o seu worker de fila, garantindo que ele rode sob o usuÔrio não-root (nginx) e que o Supervisor gerencie seus restarts.

[program:laravel_worker_group_name]
; % (process_num)02d garante que cada worker tenha um nome Ćŗnico (ex: group_name_00, group_name_01)
process_name=%(program_name)s_%(process_num)02d
; Substitua 'kafka:consume --queue=cfm_kafka' pelo comando real do seu worker
command=php /app/artisan queue:work --tries=3 --timeout=3600
numprocs=2                                ; Quantidade de processos a manter rodando
autostart=true
autorestart=true
user=nginx                                ; ā¬…ļø IMPORTANTE: Define o usuĆ”rio que executa o processo PHP
redirect_stderr=true
stdout_logfile=/app/storage/logs/supervisor_worker.log

4ļøāƒ£ Comandos Essenciais para Gerenciamento Docker šŸš€ Link para o cabeƧalho

Para construir, subir e gerenciar seu container, utilize os seguintes comandos no seu terminal (na pasta onde reside o Dockerfile):

Ação Comando Docker (Usando php74 como nome da imagem) Observações
1. Construir/Reconstruir a Imagem docker build -t php74 . O -t php74 define o nome da sua imagem. O . indica que o Dockerfile estÔ no diretório atual. Essencial após qualquer ajuste no Dockerfile ou na configuração do Supervisor.
2. Subir o Container docker run -d --name php74 -p 9000:9000 php74 O -d roda em modo detached (segundo plano). O --name php74 define o nome do container (usado no docker exec).
3. Parar o Container docker stop php74 Para o container de forma segura.
4. Iniciar o Container Parado docker start php74 Inicia um container que foi parado anteriormente.
5. Destruir/Remover o Container docker rm php74 Remove o container. Use após o stop. NecessÔrio antes de subir um novo com o mesmo nome.

5ļøāƒ£ ConsideraƧƵes Finais sobre PermissƵes Link para o cabeƧalho

Com esta configuração, o seu comando Artisan personalizado (php artisan supervisor:restart nome_do_grupo) executado via docker exec poderÔ interagir diretamente com o supervisorctl para gerenciar seus workers de forma eficaz, pois o usuÔrio que executa o docker exec (geralmente root) tem controle sobre o processo Supervisor.