Не удается подключиться к серверу базы данных в docker-compose (php и MariaDB)

Я создал файл для создания докеров, который создает 2 службы (PHP и MariaDB). Почему-то я не могу подключиться к базе данных из службы PHP: в службе PHP запущено приложение Laravel.

Сообщение об ошибке (перенаправление - это таблица в базе данных):

SQLSTATE[HY000] [2002] В соединении отказано (SQL: выберите * из redirects)

Все env-переменные должны быть правильными.

Вот мой docker-compose.yml:

version: "3.7"
services:
  faaren_backend:
    image: php:alpine
    container_name: FAA-Backend
    volumes:
      - "./:/faaren_backend"
    working_dir: /faaren_backend
    command: "php artisan serve --host=0.0.0.0 --port=8000"
    ports:
      - 8000:8000
    build:
      context: docker/php
      dockerfile: dev.Dockerfile

  faaren_database:
    image: mariadb
    container_name: FAA-Database
    ports:
    - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_DATABASE: ${DB_DATABASE}
    volumes:
    - "faa-db-data:/var/lib/mysql/data"

volumes:
  faa-db-data: {}

Мой dev.Dockerfile

FROM php:7.3-fpm

RUN apt-get update
RUN apt-get update && apt-get install -y libzip-dev \
         && docker-php-ext-install zip

RUN apt-get update && apt-get install -y libmagickwand-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN pecl install imagick
RUN docker-php-ext-enable imagick

RUN apt-get install $PHPIZE_DEPS && \
    pecl install xdebug && docker-php-ext-enable xdebug && \
    docker-php-ext-install pdo_mysql pcntl

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

VOLUME /faaren_backend

И, наконец, мой .env-файл:

DB_CONNECTION=mysql
DB_HOST=faaren_backend
DB_PORT=3306
DB_DATABASE=faaren_db
DB_USERNAME=root
DB_PASSWORD=

В основном я следовал этому руководству: https://medium.com/swlh/laravel-with-docker-compose-de2190569084


person Brotzka    schedule 01.12.2019    source источник
comment
Вы пытались взять значение ports для БД из кавычек?   -  person ygesher    schedule 01.12.2019


Ответы (2)


Вам нужно изменить хост базы данных докеров:

DB_CONNECTION=mysql
DB_HOST=faaren_database <-- edit
DB_PORT=3306
DB_DATABASE=faaren_db
DB_USERNAME=root
DB_PASSWORD=

И в раздел docker-compose.yml faaren_backend добавляем:

depends_on:
  - faaren_database

Надеюсь, это поможет.

person Dmitry    schedule 01.12.2019

Похоже, вы имеете дело с состоянием гонки. Вам нужно использовать директиву depends_on для управления порядком запуска и использовать сценарий wait, чтобы убедиться, что служба готова принимать соединения:

version: "3.7"
services:
  faaren_backend:
    image: php:alpine
    container_name: FAA-Backend
    volumes:
      - "./:/faaren_backend"
    working_dir: /faaren_backend
    command: entrypoint.sh
    ports:
      - 8000:8000
    depends_on:
      - faaren_database
    build:
      context: docker/php
      dockerfile: dev.Dockerfile

  faaren_database:
    image: mariadb
    container_name: FAA-Database
    ports:
      - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_DATABASE: ${DB_DATABASE}
    volumes:
      - "faa-db-data:/var/lib/mysql/data"

volumes:
  faa-db-data: {}

Существует множество способов проверить доступность сервиса, иногда wait-for-it может быть действительно удобным. В приведенном ниже примере используется netcat (вам нужно установить его в контейнер).

Также рекомендуется поместить скрипт в отдельный файл:

entrypoint.sh

#!/usr/bin/env bash
until nc -w 1 -z faaren_database 3306; do
  >&2 echo "Mysql is unavailable - sleeping"
  sleep 1
done
sleep 10
>&2 echo "Mysql is up - executing command"

php artisan serve --host=0.0.0.0 --port=8000

ОБНОВЛЕНИЕ: укажите правильный DB_HOST способ, предложенный Дмитрием.

person funnydman    schedule 01.12.2019