Docker создает сценарии инициализации MySql, не выполняющиеся - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблема с контейнером mysql для запуска сценариев инициализации.

У меня есть два файла create.sql и insert.sql, которые яиспользуйте для инициализации базы данных.

Я создаю образы с помощью команды docker-compose.yml, и она успешно выполняется и создает образы.

У меня две проблемы.

  1. Когда я запускаю команду docker-compose up, контейнер mysql создается и запускается успешно.Однако два сценария инициализации (create.sql и insert.sql) не работают в базе данных.

  2. Я явно используюdocker run команда для запуска созданного контейнера MySQL.В этом сценарии сценарии инициализации запускаются успешно .

Я использую Docker версия 18.09.0 и docker-compose версия 1.23.1 и ubuntu 16.04 LTS

Я новичок в докере и, похоже, не могу решить проблему.


Ниже приведены файлы, которые я использую для создания изображений.

docker-compose.yml файл.

version: '3'

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root

  demo-api:
    image: demo-api-1.0
    build: ./api
    depends_on:
      - demo-mysql
    ports:
      - 8080:8080
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

  demo1-app:
    image: demo1-app-1.0
    build: ./demo1
    depends_on:
      - demo-mysql
    ports:
      - 8090:8090
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

Ниже приведеныDockerfile для проекта весенней загрузки

FROM java:8

VOLUME /tmp

ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080

EXPOSE ${APP_PORT}

ADD /build/libs/demo-api.jar demo-api.jar

ENTRYPOINT ["java","-jar","demo-api.jar"]

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

FROM mysql:5.7

ENV MYSQL_DATABASE=demo \
    MYSQL_USER=root \
    MYSQL_ROOT_PASSWORD=root

ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d

EXPOSE 3306

1 Ответ

0 голосов
/ 21 ноября 2018

Из документации (https://hub.docker.com/_/mysql/)

Инициализация свежего экземпляра

Когда контейнер запускается в первый раз , новая база данных с указаннымИмя будет создано и инициализировано с помощью предоставленных переменных конфигурации, кроме того, оно выполнит файлы с расширениями .sh, .sql и .sql.gz, которые находятся в /docker-entrypoint-initdb.d.

Я подозреваю, что из-за постоянного тома

volumes:
      - /mnt/data/mysql-data:/var/lib/mysql

, когда Docker запускает образ mysql, уже есть БД, поэтому образ не "свежий" и сценарии не запускаются.

Обновление : мы можем подтвердить это подозрение, посмотрев здесь исходный код docker-entrypoint.sh: https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/docker-entrypoint.sh

if [ ! -d "$DATADIR/mysql" ]; then
...
...
        ls /docker-entrypoint-initdb.d/ > /dev/null
        for f in /docker-entrypoint-initdb.d/*; do
            process_init_file "$f" "${mysql[@]}"
        done

Сценарии запускаются только в том случае, если "$DATADIR/mysql" нет уже.

Кстати, лично я считаю лучшим вариантом, чтобы "приложение" создавало схему базы данных, предварительно загружало необходимые данные приложения, управляло миграциями схемы и т. д. при запуске, но это другоетема:)

...