Si tus colas de Laravel no se procesan en Docker, aquí tienes la solución rápida. Usando Supervisor dentro de tu contenedor, podrás manejar workers de forma estable y automática.
Modificaciones Necesarias
1. docker/apache/Dockerfile
FROM php:8.2-apache
RUN apt-get update && apt-get install -y \
supervisor \ # ¡Clave!
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
git \
curl \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd \
&& a2enmod rewrite \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Script de inicio personalizado
COPY docker/start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh
WORKDIR /var/www/html
EXPOSE 80
CMD ["/usr/local/bin/start.sh"] # Reemplaza el CMD por defecto
2. docker/start.sh
Este script ahora inicia Supervisor (que maneja las colas) y Apache.
#!/bin/bash
set -e
if [ ! -d "vendor" ]; then
composer install --optimize-autoloader
fi
chmod -R 777 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null || true
php artisan config:cache 2>/dev/null || true
php artisan route:cache 2>/dev/null || true
# Inicia Supervisor para manejar los workers
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
# Inicia Apache (el proceso principal)
exec apache2-foreground
3. docker/supervisor/laravel-worker.conf
Define cómo se comportarán tus workers. Este ejemplo levanta 8 procesos.
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
stopwaitsecs=3600
4. docker-compose.yml
Monta la configuración de Supervisor y asegura que start.sh sea ejecutable.
services:
db:
image: mysql:8.0
container_name: laravel-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
volumes:
- dbdata:/var/lib/mysql
networks:
- laravel-network
app:
build:
context: .
dockerfile: docker/apache/Dockerfile
container_name: laravel-app
restart: unless-stopped
ports:
- "8000:80"
volumes:
- .:/var/www/html
- ./docker/apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
- ./docker/supervisor:/etc/supervisor/conf.d
networks:
- laravel-network
depends_on:
- db
networks:
laravel-network:
driver: bridge
volumes:
dbdata:
driver: local
5. docker/apache/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Reconstruye y levanta tus contenedores:
docker-compose down
docker-compose up --build -d
Verifica que los workers estén corriendo:
docker-compose exec app supervisorctl status
Deberías ver: laravel-worker:laravel-worker_00 RUNNING
Listo. Ahora tus colas se procesarán automáticamente, los workers se reiniciarán si fallan, y tendrás un control centralizado. Olvídate de ejecutar queue:work manualmente.
¿Problemas? Revisa los logs:
docker-compose logs app y docker-compose exec app tail -f storage/logs/worker.log.