#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 (или выбрать другой способ инициализации вашей базы данных).
Результирующее изображение представляет собой базу данных, которая уже инициализирована. Вы можете использовать его и выбрасывать по своему усмотрению.
Вы также можете использовать этот процесс для создания разных изображений (помечайте их по-разному) для разных вариантов использования.
Надеюсь, это ответ на ваш вопрос.