Я пытаюсь создать контейнер с базой данных MySQL и добавить схему в эту базу данных.
Мой текущий Dockerfile:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
Чтобы создать контейнер, я следую документации, предоставленной в Docker, и выполняю эту команду:
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
Но когда я выполняю эту команду, Контейнер не создается, и в состоянии Контейнера можно видеть, что CMD не был выполнен успешно, фактически выполняется только mysql
команда.
В любом случае, есть ли способ инициализировать базу данных со схемой или мне нужно выполнять эти операции вручную?
mysql
docker
database-schema
Маркус Гомес
источник
источник
Ответы:
Я прошу прощения за этот супер длинный ответ, но у вас есть небольшой путь, чтобы добраться туда, куда вы хотите. Я скажу, что обычно вы бы не помещали хранилище для базы данных в тот же контейнер, что и сама база данных, вы либо монтировали том хоста, чтобы данные сохранялись на хосте докера, либо, возможно, контейнер мог использоваться для хранить данные (/ var / lib / mysql). Кроме того, я новичок в MySQL, так что это может быть не очень эффективным. Это сказал ...
Я думаю, что здесь может быть несколько вопросов. Dockerfile используется для создания изображения. Вам нужно выполнить шаг сборки. Как минимум, из каталога, содержащего Dockerfile, вы должны сделать что-то вроде:
Dockerfile описывает изображение для создания. Я не очень разбираюсь в mysql (я фанат postgres), но я провел поиск по сетям на предмет «как инициализировать контейнер для подключения MySQL». Сначала я создал новый каталог для работы, я назвал его mdir, затем я создал каталог файлов, в который я поместил файл epcis_schema.sql, который создает базу данных и одну таблицу:
Затем я создал скрипт с именем init_db в каталоге файлов:
(большая часть этого скрипта была взята отсюда: https://gist.github.com/pda/9697520 )
Вот сценарий files / run_db, который я создал:
Наконец, Dockerfile связывает их всех:
Итак, я перешел в мой каталог mdir (в котором есть Dockerfile вместе с каталогом files). Затем я запускаю команду:
Вы должны увидеть результат примерно так:
Теперь у вас есть изображение «7f6d5215fe8d». Я мог бы запустить этот образ:
и изображение начинается, я вижу строку:
Затем я мог бы «остановить» его и перезапустить.
Если вы посмотрите журналы, первая строка будет содержать:
Затем в конце журналов:
Это сообщения из скрипта / tmp / run_db, первое указывает, что база данных была распакована из сохраненной (начальной) версии, второе указывает, что база данных уже была там, поэтому использовалась существующая копия.
Вот ls -lR структуры каталогов, которую я описал выше. Обратите внимание, что init_db и run_db являются сценариями с установленным битом выполнения:
источник
init_db
сценария.RUN
команде, и проблема, по-видимому, решена. Но потом, когда я выполняю,docker run
у меня та же проблема соrun_db
сценарием.У меня была та же проблема, когда я хотел инициализировать схему своего экземпляра MySQL Docker, но я столкнулся с трудностями при получении этой работы после некоторого поиска в Google и следования другим примерам. Вот как я это решил.
1) Дамп вашей схемы MySQL в файл.
2) Используйте команду ADD, чтобы добавить файл схемы в
/docker-entrypoint-initdb.d
каталог в контейнере Docker.docker-entrypoint.sh
Файл будет запускать любые файлы в этом каталоге , заканчивающемся".sql"
в базу данных MySQL.Dockerfile:
3) Запустите экземпляр Docker MySQL.
Спасибо за настройку MySQL и импорт дампа в Dockerfile за подсказку по docker-entrypoint.sh и за то, что он запускает как SQL, так и сценарии оболочки!
источник
schema.sql
? Я хочу, чтобы моя БД была обновлена соответственно. И что происходит, когда я собираю этот контейнер во второй раз? Будет ли БД уничтожен и создан заново?Другой способ, основанный на слиянии нескольких ответов здесь ранее:
docker-compose file:
где
/home/user
.. это общая папка на хостеИ в
/home/user/db/mysql/init
папке .. просто удалите один файл sql, с любым именем, например,init.sql
содержащий:Согласно официальной документации mysql , вы можете поместить более одного файла sql
docker-entrypoint-initdb.d
, они выполняются в алфавитном порядке.источник
Другой простой способ - использовать docker-compose со следующими строками:
Поместите вашу схему базы данных в ./database/install_db.sql. Каждый раз, когда вы собираете свой контейнер, будет выполняться install_db.sql.
источник
Я попробовал ответ Грега с нулевым успехом, я, должно быть, сделал что-то не так, потому что в моей базе данных не было данных после всех шагов: я использовал последнее изображение MariaDB, на всякий случай.
Затем я решил прочитать точку входа для официального образа MariaDB и использовал ее для создания простого файла docker-compose :
Теперь я могу сохранить свои данные и создать базу данных с моей собственной схемой!
источник
После 4 августа 2015 года, если вы используете официальный образ MySQL Docker, вы можете просто ДОБАВИТЬ / COPY файл в каталог /docker-entrypoint-initdb.d/, и он будет работать с контейнером, инициализированным. Смотрите github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225, если вы хотите реализовать его на других изображениях контейнера
источник
Самое простое решение - использовать tutum / mysql
Шаг 1
Шаг 2
Шаг 3
Получите выше CONTAINER_ID и затем выполните команду,
docker logs
чтобы увидеть информацию о сгенерированном пароле.источник
tutum/mysql:5.5
и это удалось.docker run -d -p 3306:3306 -v /tmp:/tmp -e MYSQL_PASS="admin" -e STARTUP_SQL="/tmp/mysqldump.mysql" tutum/mysql:5.5
, Вы всегда можете выполнить команду,docker logs CONTAINER_ID
чтобы увидеть сообщения об ошибках, если у вас возникли проблемы./tmp/to_be_imported.mysql
идет путь . это путь на хост-ОС? где находитсяCOPY
илиADD
поместить вещи в файловую систему контейнера?COPY
/ADD
потому что каталог / tmp host смонтирован в / tmp контейнера. Посмотрите внимательно на команду, которая есть часть-v /tmp:/tmp
. Лично я не стал бы монтировать том просто для того, чтобы сделать файл доступным для контейнера, но я думаю, что это личный выбор.Для тех, кто не хочет создавать скрипт точки входа, как я, вы можете запустить mysqld во время сборки и затем выполнить команды mysql в вашем Dockerfile следующим образом:
Ключевым моментом здесь является отправка mysqld_safe на фон с единственным
&
знаком.источник
Ниже приведен Dockerfile, который я успешно использовал для установки xampp, создания MariaDB со схемой и предварительно заполненной информацией, используемой на локальном сервере (usrs, заказы фото и т. Д.)
источник
После того, как немного с этим бороться, посмотрите Dockerfile, используя именованные тома (db-data). Важно объявить плюс в заключительной части, где я упоминал, что объем
[external]
Все отлично сработало!
источник