Использование docker-compose для создания схемы/базы данных MySQL

Я пытаюсь создать базу данных/схему mysql, если она еще не существует.

Вот что я пробовал:

Докер-compose.yml

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
  command: "mysql -uroot -proot < createDB.sql"
  ports:
    - "3306:3306"

createDB.sql

CREATE DATABASE IF NOT EXISTS bignibou;

Это не работает. Какой был бы лучший способ использования docker/docker-compose, чтобы создать схему, если она не существует?

Ответы

Ответ 1

Наконец-то я нашел начало решения.

Образ MySQL принимает переменную среды, т.е. MYSQL_DATABASE, которая инициализирует контейнер с именем базы данных при запуске изображения. См. здесь полную документацию.

Или прочитайте выдержку ниже:

MYSQL_DATABASE

Эта переменная является необязательной и позволяет указать имя базу данных, которая будет создана при запуске изображения. Если пользователь/пароль был (см. ниже), то пользователю будет предоставлен доступ к суперпользователю (соответствующий GRANT ALL) в эту базу данных.

Вот что я придумал:

mysql:
  image: mysql:5.6.26
  environment:
   - MYSQL_ROOT_PASSWORD=root
   - MYSQL_DATABASE=bignibou
  ports:
    - "3306:3306"

Мне теперь нужен способ указать сортировку по умолчанию, но это еще одна история...

edit. Для тех, кто интересуется заданием другого значения сортировки по умолчанию, вот инструкции по использованию другого файла конфигурации, который переопределит значение по умолчанию. См. Ниже:

Использование настраиваемого файла конфигурации MySQL. Запуск MySQL Конфигурация указана в файле /etc/mysql/my.cnf, и это файл, в свою очередь, включает любые файлы, найденные в файле /etc/mysql/conf.d каталог, который заканчивается на .cnf. Настройки в файлах в этом каталоге будут дополнения и/или переопределения в /etc/mysql/my.cnf. Если ты хочешь используйте настраиваемую конфигурацию MySQL, вы можете создать свою альтернативу файл конфигурации в каталоге на главной машине, а затем смонтировать это расположение каталога как /etc/mysql/conf.d внутри mysql контейнер.

Если/my/custom/config-file.cnf - это путь и имя вашего пользовательского файл конфигурации, вы можете запустить свой контейнер mysql, как это (примечание что в этом случае используется только путь к каталогу настраиваемого конфигурационного файла команды):

$docker run --name some-mysql -v/my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql: tag Это запустит новый container some-mysql, где экземпляр MySQL использует комбинированный параметры запуска от /etc/mysql/my.cnf и /etc/mysql/conf.d/config-file.cnf, с настройками последнего приоритет.

Ответ 2

Вероятно, что вы пытаетесь сделать, требуется дополнительный script. Поэтому, если вы создаете изображение вместо прямого использования предварительно созданного изображения, вам нужно использовать файл Docker и использовать файл script, который сначала импортирует script в MySql, а затем запускает саму службу.

взгляните на этот ответ: Docker - Инициализируйте базу данных mysql со схемой

Ответ 3

Из документации документации для докеров - см. раздел "Определение служб" - вы можете указать, какой файл Docker он будет использовать для создания изображения. Поэтому вы можете создать Dockerfile на основе образа mysql и создать базу данных внутри него с помощью стандартных команд Dockerfile.

Ответ 4

Это может быть полезно, если кто-то приземлится здесь в будущем. Реальная проблема, по-видимому, является "командой" в файле docker-compose. Как только команда завершится успешно, контейнер будет уничтожен. Этот sql script должен запускаться только после запуска docker-compose и создания контейнеров. docker-compose "command" действительно запускает сервис в контейнере. В этом случае вы перегрузите службу mysql своей командой.