Почему мой docker -entrypoint-initdb.d сценарий (как указано в docker -compose.yml) не выполняется для инициализации экземпляра fre sh MySQL? - PullRequest
2 голосов
/ 02 февраля 2020

Я узнал о каталоге /docker-entrypoint-initdb.d из этого ответа , а также прочитал раздел «Инициализация fre sh instance» в «Как использовать это изображение» MySQL документация . Но когда я запускаю docker-compose up в каталоге, содержащем файл docker-compose.yml ниже, моя база данных не инициализируется.


services:

# Use root/root as MySQL user/password credentials
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_DATABASE: db
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d/:ro

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

Я подтвердил, что каталог ./mysql/init содержит файл с именем init.sql. И я подтвердил, что после очистки каталога ./mysql/data и запуска docker-compose up создается база данных db. Но база данных не заполняется, если я не выполню скрипт вручную в Adminer. (Я нажимаю «Импорт», затем выбираю файл и нажимаю кнопку «Выполнить».)

Я искал сообщения в выводе консоли после выполнения docker-compose up, которые указывают на попытку запуска init.sql и может ' ничего не найти.

Обновление: Версия MySQL - 8.0.19.

1 Ответ

2 голосов
/ 02 февраля 2020

Дьявол скрывается в деталях ...

У вас есть двойное определение root в ваших переменных env. root пользователь создается по умолчанию с паролем от MYSQL_ROOT_PASSWORD. Затем вы просите создать второго «обычного» пользователя ... с точно таким же именем и паролем (то есть с MYSQL_USER и MYSQL_PASSWORD)

Если вы внимательно посмотрите свой журнал запуска, вы увидите ошибка

db_1       | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'

Это фактически останавливает дальнейшую обработку ваших файлов инициализации в docker-entrypoint-initdb.d и продолжается с остальной частью процесса запуска образа (т. е. перезапускается mysql после инициализации на временном сервере).

Просто добавьте MYSQL_USER и MYSQL_PASSWORD в свои env vars или укажите другого пользователя, нежели root, и вы сразу увидите, что ваши файлы инициализации обработаны (не забудьте снова очистить каталог данных).

...