Создание образа MySQL с предварительно загруженной БД

Создание образа MySQL с предварительно загруженной БД

С помощью образа Docker для MySQL вы можете поместить скрипты mysqldump в определенную папку, и они будут использоваться для загрузки пустых данных при первом запуске.

Мне было интересно, как создать образ, в котором это выполнение уже произошло как часть сборки, чтобы нам не пришлось ждать начальной загрузки данных.

Целью образа является создание копии базы данных для разработчиков и локального тестирования.

Если возможно, я бы хотел, чтобы это было сделано в виде многоэтапной сборки Docker, чтобы я мог собрать его без установки MySQL на сервере сборки.

Мой общий ход мыслей (хотя я его еще не опробовал) выглядит следующим образом:

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

И buildscript.shделает что-то вроде

  1. запустить mysqld
  2. дождитесь полного запуска mysqld (??)
  3. запустить SQL-запросы, используемые для построения данных
  4. выключить mysqld
  5. синхронизация (убедитесь, что все файлы записаны)

решение1

Я думаю, что это возможно сделать в Dockerfile вместо выполнения операции в точке входа. Вам следует скопировать данные базы данных в образ и настроить my.cnf, чтобы указать каталог, в котором вы храните эти данные, и пропустить операцию дампа в точке входа. В любом случае, как личное соображение, какое преимущество вы получаете от этого? Я имею в виду, да, вам не нужно ждать создания и заполнения базы данных во время выполнения, но это будет стоить вам времени каждый раз, когда вы снова создаете образ, а также увеличит размер образа, поскольку в него включены некоторые данные. Вы должны учитывать, что если вы планируете часто перестраивать этот образ, это не сильно изменит временные затраты, если вы не планируете часто перестраивать образ, это может быть преимуществом.

решение2

Вот мое текущее рабочее решение.

Я начинаю сDockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

Затем я добавляю build-db.shнабор, который принимает существующийточка входа.shи выньте последнюю execстроку, чтобы остановить его после завершения инициализации. Данные вставлены, /dataпотому что по умолчанию /var/lib/mysqlне будет никаких данных на следующем этапе сборки.

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

Чтобы запустить его, вам необходимо --datadir=/dataиспользовать нетомной каталог.

Связанный контент