Как создать контейнер mysql docker без состояния

#mysql #docker

#mysql #docker

Вопрос:

Я хочу создать образ mysql docker, который импортирует некоторые исходные данные в процессе сборки.

Впоследствии, при использовании в контейнере, контейнер остается без состояния, что означает, что данные, добавленные во время работы контейнера, не сохраняются при повторном уничтожении / запуске контейнера, но исходные данные все еще там.

Возможно ли это? Как бы я настроил такой образ и контейнер?

Комментарии:

1. Просто напишите Dockerfile ИЗ образа MySQL, который выполняет скрипт или команду SQL для извлечения исходных данных в контейнеры. Когда ваш образ будет готов, вам просто нужно запустить контейнер ( docker run myMySQLImage )

Ответ №1:

Я предлагаю создавать таблицы MySQL по мере необходимости в SQL-скрипте или непосредственно в локальном экземпляре MySQL и экспортировать их в файл.

Имея этот файл под рукой, создайте Dockerfile, который создается на основе контейнера MySQL. Добавьте к этому другой скрипт точки входа, который вводит SQL-скрипт в базу данных.

Вы ничего не пишете о монтировании томов. Возможно, вам понадобится объем данных для базы данных или настройте MySQL для хранения всего в памяти.

Для дополнительной «безгражданственности» вы также можете удалить все таблицы в вашем SQL-скрипте.

Ответ №2:

Я думаю, что вам нужна многоступенчатая сборка:

 FROM mysql:5.7 as builder

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=somepassword

ADD initialize.aql /docker-entrypoint-initdb.d/

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec "$@"/echo "not running $@"/", "/usr/local/bin/docker-entrypoint.sh"]
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

FROM mysql:5.7

COPY --from=builder /initialized-db /var/lib/mysql

  

Вы можете поместить свои сценарии инициализации в initialize.sql (или выбрать другой способ инициализации вашей базы данных).

Результирующее изображение представляет собой базу данных, которая уже инициализирована. Вы можете использовать его и выбрасывать по своему усмотрению.

Вы также можете использовать этот процесс для создания разных изображений (помечайте их по-разному) для разных вариантов использования.

Надеюсь, это ответ на ваш вопрос.