Не уверен, поможет ли это, но у меня была такая же проблема около года go, и я закончил тем, что создал отдельный «рабочий» контейнер + дополнительный контейнер для redis, который использовался в качестве драйвера очереди. Я не трогал laravel уже довольно давно, и это была одна из моих первых попыток использовать docker, поэтому вам, возможно, придется почистить вещи и приспособиться к вашим потребностям.
Для работника, которого я использовал следующее (служба в docker compose):
worker:
build: ./docker-images/worker
volumes:
- ./app:/var/www/laravel
#- ./data/app/storage:/var/www/laravel/storage/
#- ./docker-images/php-fpm/php71.ini:/usr/local/etc/php/php.ini
- ./docker-images/worker/supervisor:/etc/supervisor
networks:
- backend
Это содержимое Dockerfile для работника (оно будет опубликовано как есть, и вы сможете выбрать, какие его части вам могут понадобиться. дело в том, что ваше приложение должно работать там + вам нужен супервизор, который будет работать как демон и все время перезапускать вашу очередь). Может быть довольно устаревшим, но должен дать представление:
#
#--------------------------------------------------------------------------
# Image Setup
#--------------------------------------------------------------------------
#
FROM php:7.1-fpm
#
#--------------------------------------------------------------------------
# Software's Installation
#--------------------------------------------------------------------------
#
# Installing tools and PHP extentions using "apt", "docker-php", "pecl",
#
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl \
vim \
git \
curl \
python3.4 \
python3-pip \
libmemcached-dev \
libz-dev \
libpq-dev \
libjpeg-dev \
libpng-dev \
libfreetype6-dev \
libssl-dev \
libmcrypt-dev \
&& rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install mcrypt \
# Install the PHP pdo_mysql extention
&& docker-php-ext-install pdo_mysql \
# Install the PHP pdo_pgsql extention
&& docker-php-ext-install pdo_pgsql \
&& docker-php-ext-install pcntl sockets bcmath mbstring opcache mysqli gettext \
# Install the PHP gd library
&& docker-php-ext-configure gd \
--enable-gd-native-ttf \
--with-jpeg-dir=/usr/lib \
--with-freetype-dir=/usr/include/freetype2 && \
docker-php-ext-install gd
#####################################
# Human Language and Character Encoding Support:
#####################################
RUN apt-get update -yqq && \
apt-get install -y zlib1g-dev libicu-dev g++ && \
docker-php-ext-configure intl && \
docker-php-ext-install intl
#####################################
# Mongo
#####################################
RUN apt-get install libcurl4-openssl-dev pkg-config -y && \
apt-get install pkg-config -y && \
apt-get install openssl -y && \
pecl install mongodb && \
docker-php-ext-enable mongodb
####################################
# Composer
####################################
RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
# Make sure we're installing what we think we're installing!
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot \
&& rm -f /tmp/composer-setup.*
## Source the bash
RUN . ~/.bashrc
#RUN composer global install
#####################################
# Image optimizers:
#####################################
#USER root
#RUN apt-get update -yqq && \
# apt-get install -y --force-yes jpegoptim optipng pngquant gifsicle \
#####################################
# ImageMagick:
#####################################
USER root
RUN apt-get update -y && \
apt-get install -y libmagickwand-dev imagemagick && \
pecl install imagick && \
docker-php-ext-enable imagick
#####################################
# Exif:
#####################################
RUN docker-php-ext-install exif
#####################################
# ZipArchive:
#####################################
RUN docker-php-ext-install zip
#####################################
# PHP REDIS EXTENSION FOR PHP 7.0
#####################################
RUN printf "\n" | pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis
#####################################
# pgsql client
#####################################
#RUN apt-get update -yqq && \
# apt-get install -y postgresql-client
#####################################
# pgsql
#####################################
#RUN apt-get update -yqq && \
# docker-php-ext-install pgsql
#####################################
# Mysql stuff
#####################################
RUN apt-get update -yqq && \
apt-get install mysql-client -y
# Install supervisor
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
supervisor \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
WORKDIR /etc/supervisor/conf.d/
Я использовал Laravel Horizon. Использование его без горизонта также работает, но требует немного другой конфигурации.
Как вы видели в объявлении сервиса docker -compose, мы сопоставляем локальную папку с конфигурациями. ./docker-images/worker/supervisor:/etc/supervisor
.
Эта структура папок выглядит следующим образом: docker -images (папка) - worker (папка, содержащая вещи, принадлежащие этой службе) - Dockerfile (содержимое размещено выше) - supervisor (папка содержит конфигурацию содержимого для супервизора) - supervisor.conf - файл конфигурации (опубликует содержимое ниже) - conf.d (папка с рабочими файлами конфигурации супервизора) - horizon.conf (файл конфигурации для laravel horizon, но также может быть запущен непосредственно в очередь, вместо запуска горизонта. Разместит содержимое ниже)
пример содержимого supervisor.conf
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0760 ; sockef file mode (default 0700)
chown=root
[supervisord]
logfile=/etc/supervisor/logs/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;childlogdir=/etc/supervisor/logs/supervisord/childlog ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
содержимое Horizon.conf
[program:horizon]
process_name=%(program_name)s
command=php /var/www/laravel/artisan horizon
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stderr_logfile=/etc/supervisor/logs/horizon/err.log
stdout_logfile=/etc/supervisor/logs/horizon/out.log
Для запуска и остановки supervisor вам нужно будет войти в рабочий контейнер через $ docker-compose exec worker bash
, и вот несколько полезных команд:
Проверка статуса
$ supervisorctl status
$ supervisorctl
stop job-name // останавливает работу
stop parser-worker: * // останавливает всю группу процессов
$ supervisorctl reread
// перечитывает конфиг фай например, если вы что-то обновите в нем
$ supervisorctl update
// применяет все изменения
В качестве альтернативы для перезапуска супервизора или повторного чтения файлов конфигурации вы можете просто перезапустить рабочий контейнер.
Кроме этого, вы также можете прочитать некоторые официальные документы руководителя. Я помню, что мне понадобилось несколько дней, чтобы все настроить, так что, надеюсь, это поможет вам.