Инициализировать базу данных Mysql при запуске контейнера Docker

MySQL Docker

1. Введение

DockerОн все больше используется в разработке, и недавно я сделалSpring Bootприложение, чтобы облегчить развертывание, будетMysqlтакже размещенDockerвбежать. Итак, как инициализироватьSQLКак насчет скриптов и данных?

У меня есть два традиционных варианта. Первое решение — импортировать вручную после запуска контейнера, что слишком мало. второй вSpring BootПодключение клиентаMysqlБаза данных инициализируется при использовании контейнера, вы можете обратиться кУправление версиями базы данных с помощью flywayстатье, но это зависит от возможностей клиента. можно ли это сделатьMysqlИнициализирует ли контейнер сам базу данных при запуске? Конечно! Продемонстрируем сегодня.Весь код смотрите в конце статьи.

2. Принцип

когдаMysqlКогда контейнер запускается в первый раз, он будет/docker-entrypoint-initdb.dсканирование каталога.sh,.sql,.sql.gzтип файла. Если файлы этих типов существуют, они будут выполнены для инициализации базы данных.Эти файлы будут выполняться в алфавитном порядке. По умолчанию они инициализируются при запуске контейнера.MYSQL_DATABASEНапример, в базе данных определений переменных следующая команда инициализируетREGION_DBбаза данных:

$ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag

Если ваша команда запуска не указывает базу данных, вы должны объявить и указать базу данных в сценарии DDL базы данных.. В противном случае будет реализовано следующее исключение:

ERROR 1046 (3D000) at line 7: No database selected

Затем мы будем использовать этот механизм для достиженияDockerБаза данных инициализируется при запуске контейнера.

3. Пользовательский файл Docker

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

FROM mysql:5.7
LABEL OG=felord.cn
COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf
COPY ./sql  /tmp/sql
RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d
RUN rm -rf /tmp/sql
  • Первым шагом является официальное представлениеMysql:5.7Докер образ.
  • Второй шаг практического значения не имеет, в основном информация об авторе и организации.
  • Третий шаг очень важен! Первоначально я не настраивал третью строку, но после запуска контейнера я обнаружил, что все китайские символы данных инициализации были искажены. Поэтому его необходимо изменить перед инициализацией базы данных.MysqlКодировка и другие настройки, здесь я также изменил часовой пояс на+8:00.
  • Четвертый шаг, скопируйте сценарий базы данных, содержащий./sqlпапка для зеркала/tmp/sqlВниз.
  • Пятый шаг, используйтеmvКоманда помещает все файлы в папку, скопированную на четвертом шаге..sqlфайл скопирован в/docker-entrypoint-initdb.dвниз, чтобы вы могли использовать2. ГлавыМеханизм инициализации базы данных.
  • Шестой шаг, удалите используемый временный каталог.

Затем вы можете создать собственный образ Mysql с помощью команды build image:

# 一定不要忘记最后的一个 . 点
docker build -t mysql:5.7c .

пройти черезmysql:5.7cЗеркало запускает файл с именемmysql-serviceконтейнер,rootпароль123456и сохранить данные на хостеD:/mysql/dataВниз:

docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7c

Совет: можно пройтиSHOW VARIABLES LIKE 'character%'Посмотрите, изменился ли набор символов наutf8mb4, так же можно пройтиSHOW VARIABLES LIKE '%time_zone%'Проверьте, является ли часовой пояс Dongba.

4. Резюме

Сегодня мы настраиваем базу данных, которую можно инициализироватьMysqlЗеркало для облегчения нашего развертывания. Вы также можете обратиться к этой идее, чтобы настроить некоторые другие вещи, которые вам нужны.Dockerзеркало. полная статьяDemoДоступно через мой личный блог.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn