Я пытаюсь настроить Dockerfile для своего проекта LAMP, но при запуске MySQL возникают некоторые проблемы. В моем Dockerfile есть следующие строки:
VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql
Но я продолжаю получать эту ошибку:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Есть идеи о том, как настроить создание базы данных и импорт дампа во время сборки Dockerfile?
RUN
команда выполняется в другом контейнере. Это хорошо объяснено здесь: stackoverflow.com/questions/17891669/…RUN
строке.RUN
с несколькими шагами. Вы можете найти пример многоэтапной установки программного обеспечения здесь: stackoverflow.com/questions/25899912/install-nvm-in-docker/…Ответы:
Каждая
RUN
инструкция в aDockerfile
выполняется на отдельном уровне (как описано в документацииRUN
).В вашем у
Dockerfile
вас есть триRUN
инструкции. Проблема в том, что сервер MySQL запускается только в первый раз. В других MySQL не работает, поэтому вы получаете ошибку соединения сmysql
клиентом.Для решения этой проблемы у вас есть 2 решения.
Решение 1.Используйте однострочную
RUN
Решение 2.Используйте сценарий
Создайте исполняемый скрипт
init_db.sh
:Добавьте эти строки в свой
Dockerfile
:источник
docker run
запусков, вам необходимо смонтировать тома. Если вы просто хотите иметь контейнер со своим дампом, но не хотите сохранять дальнейшие модификации, вы можете избавиться отVOLUME
инструкции в вашемDockerfile
.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
при попытке решения 1. Следуя журналамmysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
иmysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
mysql_init_db
и загрузите в структуру своей базы данных. Это обеспечивает гибкость автоматического сброса базы данных при тестировании, но если вы хотите, чтобы она сохраняла или тестировала разные наборы данных, вы просто монтируете том в / var / lib / mysql, используяdocker run -v ...
.Последняя версия официального образа докеров mysql позволяет импортировать данные при запуске. Вот мой docker-compose.yml
Здесь у меня есть файл data-dump.sql
docker/data
, относящийся к папке, из которой выполняется docker-compose. Я монтирую этот sql-файл в этот каталог/docker-entrypoint-initdb.d
контейнера.Если вам интересно узнать, как это работает, посмотрите их
docker-entrypoint.sh
на GitHub. Они добавили этот блок, чтобы разрешить импорт данныхДополнительное примечание: если вы хотите, чтобы данные сохранялись даже после остановки и удаления контейнера mysql, вам необходимо иметь отдельный контейнер данных, как вы видите в docker-compose.yml. Содержимое контейнера данных Dockerfile очень простое.
Контейнер данных даже не должен находиться в начальном состоянии для сохранения.
источник
- ./docker/data:/docker-entrypoint-initdb.d
убран.
перед каталогом контейнера.Я загрузил свой sql-дамп в папку "db-dump" и смонтировал его:
При
docker-compose up
первом запуске дамп восстанавливается в бд.источник
mysql
кажется, не загружает сброшенный файл sql, и даже при использовании 5.6 у меня проблемы с механизмами хранения InnoDb.Я использовал подход docker-entrypoint-initdb.d (спасибо @Kuhess) Но в моем случае я хочу создать свою БД на основе некоторых параметров, которые я определил в файле .env, поэтому я сделал это
1) Сначала я определяю файл .env примерно так в моем корневом каталоге проекта докера.
2) Затем я определяю свой файл docker-compose.yml. Поэтому я использовал директиву args для определения переменных среды и установил их из файла .env
3) Затем я определяю папку mysql, которая включает файл Dockerfile. Итак, Dockerfile - это
4) Теперь я использую mysqldump для дампа моей базы данных и помещаю data.sql в папку mysql.
Это обычный файл дампа sql, но я добавляю две строки в начале, чтобы файл выглядел так
Итак, что случилось, я использовал команду «RUN sed -i 's / MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql», чтобы заменить
MYSQL_DATABASE
заполнитель на имя моей БД, которое я установил в .env файл.Теперь вы готовы построить и запустить свой контейнер.
источник
.env
файла. Однако в соответствии с этим , то.env
функция файл работает только при использованииdocker-compose up
команды и не работает сdocker stack deploy
. Таким образом, если вы хотите использовать.env
файл в производстве, вы можете проверить секреты докеров , представленные вdocker 17.06
. Затем вы можете использовать свой .env файл в конъюнкции с секретами как в области развитияdocker compose up
и производстваdocker stack deploy
фазRUN sed -i '1s/^/CREATE DATABASE IF NOT EXISTS
$ MYSQL_DATABASE;\nUSE
$ MYSQL_DATABASE;\n/' data.sql
вместоsed
предложенной вами команды. Таким образом, вы можете использовать любой имеющийся у вас файл дампа - это полезно, если вы работаете с большим объемом данных :)Вот рабочая версия , использующая
v3
вdocker-compose.yml
. Ключевым моментом является директива объемов :В каталоге, который у меня есть, у
docker-compose.yml
меня есть каталогdata
, содержащий.sql
файлы дампа. Это хорошо, потому что можно.sql
файл дампа для каждой таблицы.Я просто бегу,
docker-compose up
и мне хорошо. Данные автоматически сохраняются между остановками. Если вы хотите удалить данные и «засосать» новые.sql
файлы, запуститеdocker-compose down
тогдаdocker-compose up
.Если кто-нибудь знает, как заставить
mysql
докер повторно обрабатывать файлы/docker-entrypoint-initdb.d
без удаления тома, оставьте комментарий, и я обновлю этот ответ.источник
docker-compose down
было очень важно, поскольку я не видел никаких изменений, несмотря на перезапуск docker-compose. MYSQL_DATABASE - обязательная переменная в этом случаеМне не очень нравится принятый ответ Кухесса, поскольку он
sleep 5
кажется мне немного хакерским, поскольку предполагает, что демон mysql db правильно загрузился в течение этого периода времени. Это предположение, никаких гарантий. Также, если вы используете предоставленный образ докера mysql, сам образ уже позаботится о запуске сервера; Я бы не стал вмешиваться в это с кастомом/usr/bin/mysqld_safe
.Я следил за другими ответами здесь и скопировал сценарии bash и sql в папку
/docker-entrypoint-initdb.d/
в контейнере докеров, так как это явно предполагаемый способ поставщиком изображений mysql. Все в этой папке выполняется, как только демон db готов, поэтому вы можете на него положиться.В дополнение к другим - поскольку ни один другой ответ явно не упоминает об этом: помимо сценариев sql вы также можете копировать сценарии bash в эту папку что может дать вам больше контроля.
Это то, что мне было нужно, например, поскольку мне также нужно было импортировать дамп, но одного дампа было недостаточно, поскольку он не указывал, в какую базу данных он должен импортировать. Итак, в моем случае у меня есть сценарий
db_custom_init.sh
с таким содержанием:и этот Dockerfile копирует этот скрипт:
edit: Обратите внимание, что это будет импортировать дамп sql только во время создания контейнера, а не во время сборки образа!
источник