Ответ 1
Вы можете загрузить файл sql во время фазы build
изображения. Для этого вы создаете Dockerfile
для службы db
, которая будет выглядеть примерно так:
FROM mysql:5.6
COPY setup.sh /mysql/setup.sh
COPY setup.sql /mysql/setup.sql
RUN /mysql/setup.sh
где setup.sh
выглядит примерно так:
#!/bin/bash
set -e
service mysql start
mysql < /mysql/setup.sql
service mysql stop
И в вашем docker-compose.yml
вы измените image
на build: ./db
или путь, по которому вы поместите свои файлы.
Теперь это работает, если у вас есть все ваши sql в необработанном файле .sql
, но это не так, если вы используете рельсы или аналогичную структуру, где sql фактически хранится в коде. Это оставляет вам два варианта.
-
Вместо использования
FROM mysql:5.6
вы можете использоватьFROM your_app_image_that_has_the_code_in_it
иapt-get install mysql ...
. Это дает вам более крупное изображение, содержащее как mysql, так и ваше приложение, позволяющее запускать рубиновые команды выше. Вы заменили быmysql < /mysql/setup/sql
на строкиrails-app bundle exec rake db:create
. Вам также необходимо предоставить конфигурацию приложения, которая попадает в базу данных наlocalhost:3306
вместоdb:3306
-
Мой предпочтительный вариант - создать script, который экспортирует sql в файл
.sql
, который затем можно использовать для создания контейнера базы данных. Это немного больше работы, но намного приятнее. Это означает, что вместо запускаrails-app bundle exec rake db:create
вы просто запустите script, чтобы загрузить db.
Такой script будет выглядеть примерно так:
#!/bin/bash
set -e
docker-compose build rails-app
docker run -d --name mysql_empty mysql:5.6
docker run --link mysql_empty:db -v $PWD:/output project_rails-app export.sh
где export.sh
выглядит примерно так:
#!/bin/bash
set -e
RAILS_ENV=development
rails-app bundle exec rake db:create
mysqldump > /output/setup.sql
Вы также можете заменить docker run
script на второй файл компоновки, если хотите.