Сценарий: Я разработал микросервис 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.
Итак, я не эксперт, но я ищу хорошее решение:
Я не знаю, что здесь лучше всего, и я был бы очень благодарен за помощь в том, как это создать.






Для загрузки файлов 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 больше не поддерживается
Вы можете установить версию файла docker-compose.yml как 2.1. Нравится здесь
Но разве не обязательно, чтобы версия соответствовала моей версии движка докеров, например здесь
Это необходимо, если вы развертываете это в рое, иначе это сработает. Моя версия движка докера — 18.09.1, а моя версия файла компоновки — 2.1, и она работает как шарм. В приведенном выше ссылка на сайт упоминается, что версия компоновочного файла 2.1 будет работать на всех версиях движка Docker, выпущенных после v1.12.0.
Не прямое решение вашего вопроса. Но если вы используете инструмент миграции базы данных, такой как Flyway, вам не нужно комментировать/раскомментировать свойства конфигурации. В зависимости от текущего состояния базы данных Flyway автоматически запустит сценарии миграции.