Docker -составить Laravel как ждать загрузки базы данных? - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь настроить тесты для моего Laravel приложения.
Приложение запускается с Docker compose.

Когда я пытаюсь запустить свои тесты с помощью этой команды:

docker-compose -p tests --env-file .env_tests --rm run myapp ./vendor/bin/phpunit

тесты начинают выполняться до того, как контейнер базы данных будет готов.
Как я могу заставить мои тесты ждать готовности базы данных?

Мой docker-compose.yml выглядит следующим образом:

version: '2'

services:
  mariadb:
    image: 'bitnami/mariadb:10.1'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=my_user
      - MARIADB_DATABASE=my_database
      - MARIADB_PASSWORD=my_password
    ports:
      # connect your dbeaver/workbench to localhost:${WORKBENCH_PORT}
      - ${WORKBENCH_PORT}:3306
    # volumes:
      # Do not load databases here, as there is no
      # good way for other containers to wait for this to finish
      # - ./database:/docker-entrypoint-initdb.d
  myapp:
    tty: true
    image: bitnami/laravel:6-debian-9
    environment:
      - DB_HOST=mariadb
      - DB_USERNAME=my_user
      - DB_DATABASE=my_database
      - DB_PASSWORD=my_password
    depends_on:
      - mariadb
    ports:
      - 3000:3000
    volumes:
      - ./:/app

Когда я обычно запускаю приложение (docker-compose up), Laravel ждет, пока контейнер mariadb завершит загрузку sh, но я не смог выяснить, как это сделать.

---- Edit ----
Я обнаружил, что используемый мной контейнер bitami / laravel Docker имеет скрипт под названием wait_for_db(), который, кажется, ожидает базу данных .
Что я еще не выяснил, так это почему этот скрипт запускается в обычном режиме, а не когда я запускаю тесты.

1 Ответ

1 голос
/ 12 января 2020

Согласно официальным документам , нельзя дождаться готовности базы данных, но только до ее запуска:

Однако для запуска Compose не подождите, пока контейнер не будет «готов» (что бы это ни значило для вашего конкретного приложения) - только пока он не запустится. Для этого есть веская причина. (...) Лучшее решение - выполнить эту проверку в коде приложения как при запуске, так и при любой потере соединения по любой причине.

Разница в поведении вашего приложения в общем случае и тестовый пример может быть связан с другими причинами, такими как тест, занимающий меньше времени для загрузки (давая меньше времени для подготовки базы данных) или тест для обработки сбоя соединения другим способом (без повторных попыток через некоторое время).

РЕДАКТИРОВАТЬ

Использование docker-compose run переопределяет точку входа контейнера. Поэтому, даже если изначально был сценарий, предназначенный для ожидания инициализации базы данных, он не будет запускаться.

Проверьте документы по команде :

Во-первых, команда, переданная командой run, переопределяет команду, определенную в конфигурации службы. Например, если конфигурация веб-службы запущена с bash, то docker-compose run web python app.py переопределяет ее с python app.py.

...