Запустите laravel работник очереди в docker - PullRequest
0 голосов
/ 17 марта 2020

Я хочу запустить php artisan queue:work --daemon команду в docker файле или docker -compose.yml, но если я использую команду: xxx в docker compose file, ngin x возвращает 502.
Я пытаюсь использовать bash файл и снова он не работает.
Кто-нибудь может мне помочь?
Мне нужно закончить sh это сегодня и действительно нужна помощь.
Docker составить файл

version: '3'
services:

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: LibraryWebserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: Librarydb
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: library
      MYSQL_ROOT_PASSWORD: Library!23
      MYSQL_USER: root
      MYSQL_PASSWORD: Library!23
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network
    volumes:
      - dbdata:/var/lib/mysql

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hoseinnormohamadi/lumen:Library
    container_name: Library
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
    networks:
      - app-network
#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

1 Ответ

0 голосов
/ 18 марта 2020

Не уверен, поможет ли это, но у меня была такая же проблема около года 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 // применяет все изменения

В качестве альтернативы для перезапуска супервизора или повторного чтения файлов конфигурации вы можете просто перезапустить рабочий контейнер.

Кроме этого, вы также можете прочитать некоторые официальные документы руководителя. Я помню, что мне понадобилось несколько дней, чтобы все настроить, так что, надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...