Задать вопрос
@j238267431

Почему сервис не запускается в контейнере докер?

Добрый день

делаю приложение в докере 3 контейнера в одном RabbitMQ в других Laravel

Dockerfile
FROM php:8.2
RUN apt-get update && apt-get install -y \
         libfreetype6-dev \
         libjpeg62-turbo-dev \
         libmcrypt-dev \
         libpng-dev \
         zlib1g-dev \
         libxml2-dev \
         libzip-dev \
         libonig-dev \
         graphviz \
      && docker-php-ext-configure gd \
      && docker-php-ext-install -j$(nproc) gd \
      && docker-php-ext-install pdo_mysql \
      && docker-php-ext-install mysqli \
      && docker-php-ext-install zip \
      && docker-php-ext-install sockets \
      && docker-php-source delete \
      && curl -sS https://getcomposer.org/installer | php -- \
         --install-dir=/usr/local/bin --filename=composer
WORKDIR /app
COPY . .
RUN composer install


docker-compose.yml

version: '3.8'
services:
  main:
    build:
      context: .
      dockerfile: Dockerfile
    command: 'php artisan serve --host=0.0.0.0'
    ports:
      - 8001:8000
    depends_on:
      - main_db 

    volumes:
      - ./:/app
    networks:
      - mm-network

  main_queue:
    build:
      context: .
      dockerfile: Dockerfile
    command: 'php artisan queue:work'
    depends_on:
      - main_db 
    networks:
      - mm-network

  main_db:
    image: mysql:5.7.22
    environment:
      MYSQL_DATABASE: main
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./storage/dbdata:/var/lib/mysql
    ports:
      - 33071:3306
    networks:
      - mm-network  
networks:
  mm-network:
    external: true


.env
DB_CONNECTION=mysql
DB_HOST=main_db
DB_PORT=3306
DB_DATABASE=main
DB_USERNAME=root
DB_PASSWORD=root


Сервис main_queue: нужен чтобы команда php artisan queue:work запускалась при создании контейнера, но при запуске этот сервис не запускается и выдает ошибку

main_queue-1  | 
main_queue-1  |    Illuminate\Database\QueryException 
main_queue-1  | 
main_queue-1  |   SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from `cache` where `key` in (illuminate:queue:restart))
main_queue-1  | 
main_queue-1  |   at vendor/laravel/framework/src/Illuminate/Database/Connection.php:813
main_queue-1  |     809▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
main_queue-1  |     810▕                 );
main_queue-1  |     811▕             }
main_queue-1  |     812▕ 
main_queue-1  |   ➜ 813▕             throw new QueryException(
main_queue-1  |     814▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
main_queue-1  |     815▕             );
main_queue-1  |     816▕         }
main_queue-1  |     817▕     }
main_queue-1  | 
main_queue-1  |       +40 vendor frames 
main_queue-1  | 
main_queue-1  |   41  artisan:13
main_queue-1  |       Illuminate\Foundation\Application::handleCommand(Object(Symfony\Component\Console\Input\ArgvInput))
main_queue-1  | 
main_queue-1 exited with code 1


Пишут в гугле, что нужно в .env файле DB_HOST указать название сервиса базы данных, main_db в моем случае - так оно и указано

При этом если запустить этот сервис повторно, когда уже запущены другие сервисы, то он запускается норм
Подскажите пожалкйста, как сделать, чтобы сервис запускался при первоначальном запуске?
  • Вопрос задан
  • 167 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
black1277
@black1277
Вольный стрелок
Он же пишет 'Connection refused' - значит когда он стартует БД еще не готова принять соединение. Если думали, что это:
depends_on:
      - main_db

спасает от этого - увы нет. Чтобы сервис стартовал нормально нужно проверять готовность БД:
services:
  mysql:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "mysql", "-p${DB_PASSWORD:-secret}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s

а сервис стартовать по готовности БД:
main_queue:
    depends_on:
      mysql:
        condition: service_healthy
        restart: true
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dronmaxman
VoIP Administrator
main_queue:
    build:
      context: .
      dockerfile: Dockerfile
    command: 'php artisan queue:work'
    depends_on:
      - main_db 
    networks:
      - mm-network
    environment:
      - DB_CONNECTION=${DB_CONNECTION}
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_DATABASE=${DB_DATABASE}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}


или

main_queue:
    build:
      context: .
      dockerfile: Dockerfile
    command: 'php artisan queue:work'
    depends_on:
      - main_db 
    networks:
      - mm-network
    env_file:
      - .env
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы