Как запустить базу данных MySql в Docker Compose

Сценарий: Я разработал микросервис Spring, который использует базу данных mysql 8. Эту базу данных необходимо инициализировать (создать базу данных, некоторые таблицы и данные). На моем хост-компьютере я инициализировал базу данных с помощью сценариев data.sql и schema.sql. Проблема в том, что я должен установить:

spring.datasource.initialization-mode=always

для первого выполнения. Это инициализирует мою БД так, как я хочу. Для будущих запусков я должен прокомментировать эту команду. Очень уродливое решение, но я не смог найти лучшего, и я не получил ответа прямо сейчас на этот вопрос. Я думал, что для тестирования это нормально, но я определенно должен это улучшить. В настоящее время я хочу запустить свой сервис с докером с помощью докер-композиции.

Ожидал: Это файл docker-compose. Довольно просто. Я новичок в мире докеров, и поэтому я хочу двигаться вперед шаг за шагом.

version: '3' 
services:usermanagement-service:
build:
  ./UserManagementService
restart:
  on-failure
ports:
  - "7778:7778"
links:
  - mysqldb
depends_on:
  - mysqldb   mysqldb:
build:
  ./CustomMySql
volumes:
  - ./mysql-data:/var/lib/mysql
restart:
  on-failure
environment:
  MYSQL_ROOT_PASSWORD: root
  MYSQL_DATABASE: userdb
  MYSQL_USER: testuser
  MYSQL_PASSWORD: testuser
expose:
  - "3600"

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

Проблема: Итак, помимо этого уродливого решения, я сталкиваюсь с проблемами во время выполнения. На docker-compose up мой микросервис работает быстрее, чем инициализация базы данных. Поэтому он пытается вызвать БД, что приводит к ошибке en. Из-за restart on failure снова появляется микросервис. Теперь это работает, потому что инициализация базы данных завершена.

Решение: Я поискал на www, и это похоже на известную проблему, которую можно решить в файле wait-for-it.sh. Это должно быть включено с COPY в Dockerfile. Итак, я не эксперт, но я ищу хорошее решение:

  • инициализировать базу данных из весны и заставить мою службу ждать, пока mysql не будет готов
  • или инициализировать базу данных из моего контейнера через том при первом запуске и, конечно же, решить эту проблему инициализации.

Я не знаю, что здесь лучше всего, и я был бы очень благодарен за помощь в том, как это создать.

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

K. Siva Prasad Reddy 01.02.2019 14:49
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
7
1
15 535
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для загрузки файлов sql только при первом запуске:

Вы можете использовать приведенный ниже файл компоновки

version: '2.1'
services:

  usermanagement-service:
    build: ./UserManagementService
    restart: on-failure
    ports:
      - "7778:7778"
    depends_on:
      mysqldb:
        condition: service_healthy

  mysqldb:
    image: mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./mysql-init-files:/docker-entrypoint-initdb.d
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: userdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testuser
    ports:
      - "3600:3306"
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

Вы должны поместить файлы data.sql и schema.sql в каталог ./docker-entrypoint-initdb.d, используя Volumesдля получения дополнительной информации.

Файлы SQL в этой папке будут загружены, только если Каталог данных БД пуст (самый первый запуск службы БД). (т.е.) в вашем случае папка ./mysql-data должна быть пустой

Для вашей второй проблемы:

Вместо wait-for-it.sh вы можете использовать healthcheck и service_healthy. Здесь usermanagement-service будет запущен, как только mysqldb успешно выполнит ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] в указанный интервал. Дополнительные сведения о проверке работоспособности и depend_on см. в статье здесь.

Получена команда test от здесь.

Спасибо за Ваш ответ. Но у меня возникла проблема с использованием синтаксиса depend_on: services.usermanagement-service.depends_on содержит недопустимый тип, это должен быть массив, кроме того: условие github.com/moby/moby/issues/30404 больше не поддерживается

FishingIsLife 01.02.2019 15:44

Вы можете установить версию файла docker-compose.yml как 2.1. Нравится здесь

Thilak 01.02.2019 16:23

Но разве не обязательно, чтобы версия соответствовала моей версии движка докеров, например здесь

FishingIsLife 01.02.2019 16:29

Это необходимо, если вы развертываете это в рое, иначе это сработает. Моя версия движка докера — 18.09.1, а моя версия файла компоновки — 2.1, и она работает как шарм. В приведенном выше ссылка на сайт упоминается, что версия компоновочного файла 2.1 будет работать на всех версиях движка Docker, выпущенных после v1.12.0.

Thilak 01.02.2019 17:04

Другие вопросы по теме