Как запустить сценарий инициализации в контейнере docker, который был создан путем фиксации контейнера mysql5.7 с существующей базой данных? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть большая база данных c, в которую не вставляются / обновляются данные.

Я создал Dockerfile следующим образом, который хорошо работает для создания базы данных в контейнере docker. Существует множество вставок. sql скриптов в data /, которые заполняют базу данных.

FROM mysql:5.7
ADD data/* /docker-entrypoint-initdb.d/
EXPOSE 3306

Единственная проблема с этим состоит в том, что для запуска требуется много времени, поэтому я запустил контейнер локально и немного подкорректировал, чтобы данные сохранялись в контейнере, и я удалил сценарии запуска из каталога сценариев запуска. Затем я зафиксировал этот контейнер в новом docker образе (committed-image:v1).

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

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

1 Ответ

1 голос
/ 16 марта 2020

Проблема в том, что ваш сценарий входа для mysql: 5,7 (по умолчанию) довольно сложный. DATABASE_ALREADY_EXISTS основана на существовании каталога mysql / database, и поэтому ROOT не инициализируется повторно. Трудно заставить загруженную базу данных существовать без системных таблиц, включая пользователя root.

Решения:

a) конфигурация по умолчанию для экземпляра mysql не особенно способствует большим нагрузкам на базу данных. Включение элемента конфигурации, который устанавливает innodb_buffer_pool_size в несколько гигабайт оперативной памяти / 80% доступной оперативной памяти, поможет загрузить и запустить.

и / или:

b) установить innodb_file_per_table = 1 в конфигурации, а затем для SQL, используйте CREATE TABLESPACE / ALTER TABLE .. TABLESPACE =, чтобы загрузить данные из предварительно сгенерированного файла IDB. См. эти инструкции из руководства по извлечению табличного пространства.

Для создания / настройки параметров файла конфигурации см. Примечания readme из dockerhub . Вы также можете просто вставить файл типа /etc/mysql/conf.d/config-file.cnf в свой Dockerfile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...