I've got a dockerized Laravel app which is working just fine. Recently, a job was added to the app, to manage this job we'll use supervisor.
When running the app docker-compose --build the app is build as expected, but I'm seeing an error in the std output related to supervisor:
dmc-supervisor | Error: The directory named as part of the path /var/www/storage/logs/worker.log does not exist in section 'program:app-worker' (file: '/etc/supervisor/conf.d/worker.conf')
dmc-supervisor | For help, use /usr/bin/supervisord -h
dmc-supervisor exited with code 2
According to this, I'd expect supervisor not to be running but weirdly enough when I run an action that will trigger the job I'm seeing the correct results, meaning that somehow the job is running.
If I log into the container docker exec -it a4b21cb5b474 bash and run supervisorctl status I'm getting:
unix:///var/run/supervisor.sock no such file
if I run supervisord I'm getting:
Traceback (most recent call last):
File "/usr/bin/supervisord", line 33, in <module>
sys.exit(load_entry_point('supervisor==4.2.2', 'console_scripts', 'supervisord')())
File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 359, in main
go(options)
File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 369, in go
d.main()
File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 72, in main
self.options.make_logger()
File "/usr/lib/python3/dist-packages/supervisor/options.py", line 1494, in make_logger
loggers.handle_file(
File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 419, in handle_file
handler = RotatingFileHandler(filename, 'a', maxbytes, backups)
File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 213, in __init__
FileHandler.__init__(self, filename, mode)
File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 160, in __init__
self.stream = open(filename, mode)
PermissionError: [Errno 13] Permission denied: '/etc/supervisor/logs/supervisord.log'
If I visit the folder that it is complaining about in the build (/var/www/storage/logs/), I can verify that it does exist:
$ pwd
/var/www/storage/logs
Any idea what's going on?
Here's my Dockerfile:
FROM php:8.1.12-fpm
ARG uid=1000
ARG user=inigomontoya
RUN apt-get update && apt-get install -y \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
git \
curl \
zip \
unzip \
supervisor
# Install and enable xDebug
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install php modules required by laravel.
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Create system user to run Composer and Artisan commands.
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Create directory for supervisor logs
RUN mkdir -p "/etc/supervisor/logs"
# Copy supervisor config files
ADD ./docker/config/supervisor/supervisord.conf /etc/supervisor/conf.d/worker.conf
USER $user
Here's my docker-compose.yaml:
version: "3.9"
services:
app:
build:
context: ./
dockerfile: Dockerfile
image: dmc
container_name: dmc-app
restart: unless-stopped
working_dir: /var/www/
depends_on:
- db
- nginx
volumes:
- ./:/var/www/
- ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
- ./images:/public/images
expose:
- "9003"
networks:
- dmc-net
nginx:
image: nginx:1.23.2-alpine
container_name: dmc-nginx
restart: unless-stopped
ports:
- "8000:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- dmc-net
supervisor:
image: dmc
container_name: dmc-supervisor
networks:
- dmc-net
depends_on:
- app
- nginx
command:
- supervisord
db:
image: mysql:8.0.31
container_name: dmc-db
restart: unless-stopped
# using 3307 on the host machine to avoid collisions in case there's a local MySQL instance installed already.
ports:
- "3307:3306"
# use the variables declared in .env file
environment:
MYSQL_HOST: ${DB_HOST}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: abcd1234
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
- mysql-data:/var/lib/mysql
networks:
- dmc-net
networks:
dmc-net:
driver: bridge
volumes:
mysql-data:
And here's my supervisord.conf file:
[supervisord]
logfile=/etc/supervisor/logs/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=5MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=unix:///var/run/supervisord.sock
[program:app-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
redirect_stderr=true
user=root
stdout_logfile=/var/www/storage/logs/worker.log
NOTE: With this configuration the containers are built and running, but I'm getting the issues I just pointed above, but if I add either:
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/worker.conf"]
or
CMD ["/usr/bin/supervisord"]
at the end of my Dockerfile then the build gets in a loop where the error:
PermissionError: [Errno 13] Permission denied: '/etc/supervisor/logs/supervisord.log'
is constantly thrown and it never builds.
Thanks.
docker run -d your-image php /var/www/app/artisan queue:work --sleep=3 --tries=3in a separate container, without involving supervisord?php /var/www/app/artisan queue:work? One question that arises, this container would be a copy ofappright? which would take more space and resources than simply runningsupervisor, right? I don't know, i'm just askingDockerfile, shouldn't that work?