2015-08-15 7 views
14

Я пытаюсь создать базу данных/схему mysql, если она еще не существует.Использование docker-compose для создания схемы/базы данных 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, чтобы создать схему, если она не существует?

+0

Создает ли createDB.sql 'USE bignibou;' как свою первую строку? –

+0

Нет. У этой строки нет ... – balteo

+0

Проблема с моей надстройкой-докерером заключается в том, что 'command:' должен запускать контейнер. Поэтому я ищу способ запустить команду post на контейнере ... – balteo

ответ

19

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

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

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

MYSQL_DATABASE

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

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

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

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

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

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

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

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

+0

Поверьте мне: гораздо проще со сценариями и файлом Docker – Grasshopper

+3

Вот способ указания сортировки по умолчанию в файле docker-compose.yml: mysql: image: mysql: 5.7 команда: [mysqld, --character-set- server = utf8mb4, --collation-server = utf8mb4_unicode_ci] – William

0

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

+0

Привет. Ммм. Единственная проблема заключается в том, что если я хочу перейти на другую версию mysql, мне нужно изменить файл Docker и обновить его с помощью моей пользовательской команды, которая создает базу данных. Это не большое дело, но не полностью чистая, поскольку я не продлеваю Dockerfile, но изменяю его ... – balteo

1

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

взглянуть на этот ответ: Docker - Initialize mysql database with schema

+0

Привет @mohamnag и спасибо за ваш ответ! Я добавил комментарий к ответу кузнечика, который относится и к вашему сообщению. – balteo

+0

вышеупомянутая ссылка - это ситуация, когда у вас есть файл докеров, и вы не знаете, является ли БД только новым или является более старым, который не должен быть инициализирован. лучшее решение в вашем случае очень сильно зависит от того, какая версия должна быть обновлена ​​до какой версии. несколько раз монтирование внешнего тома и повторное использование его на новом, иногда будет работать. – mohamnag

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^