Docker Compose mysql import.sql
У меня возникли проблемы с импортом файла.sql dump с docker-compose. Я следил за документами, которые, очевидно, будут загружать файл.sql из docker-entrypoint-initdb.d. Однако, когда я запускаю docker-compose up
докеров, файл sql не копируется в контейнер.
Я попытался остановить контейнеры с флагом -vf
, но это тоже не сработало. Я что-то делаю неправильно в моем сценарии.yml?
У меня есть dump.sql в базе данных каталога /db-dump/в корне, где находится мой файл compose.
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
volumes:
- ./database/db-dump:/docker-entrypoint-initdb.d
Ответы
Ответ 1
После многих попыток с настройками томов я нашел обходное решение
Я создал другое изображение на основе mysql со следующим в файле Dockerfile
FROM mysql:5.6
ADD dump.sql /docker-entrypoint-initdb.d
Затем удалили тома из композиции и запустили новое изображение
frontend:
image: myimage
ports:
- "80:80"
links:
- mysql
mysql:
image: mymysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: myimage_db
Таким образом, дамп всегда копируется и запускается при запуске
Ответ 2
Это сработало для меня,
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: ecommerce
adminer:
image: adminer
restart: always
ports:
- 8080:8080
mysql-dump должен быть каталогом. Все .sql в каталоге будут импортированы.
Ответ 3
Это появляется на странице документации образа Docker MySQL: https://hub.docker.com/_/mysql/
Инициализация свежего экземпляра
Когда контейнер запускается в первый раз, будет создана новая база данных с указанным именем и инициализирована с предоставленными переменными конфигурации. Кроме того, он будет выполнять файлы с расширениями .sh
, .sql
и .sql.gz
которые находятся в /docker-entrypoint-initdb.d. Файлы будут выполнены в алфавитном порядке. Вы можете легко заполнить ваши службы mysql, смонтировав дамп SQL в этот каталог и предоставив пользовательские изображения с предоставленными данными. Файлы SQL будут импортированы по умолчанию в базу данных, указанную в переменной MYSQL_DATABASE
.
Ответ 4
Mysql базы данных dump schema.sql находится в каталоге /mysql-dump/schema.sql и создает таблицы в процессе инициализации.
докер-compose.yml:
mysql:
image: mysql:5.7
command: mysqld --user=root
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
Ответ 5
У меня была похожая проблема с mysql, где я монтировал локальный каталог в /configs/mysql/data, содержащий файл mydatabasedump.sql, через docker-compose для тома docker-entrypoint-initdb.d,
файл будет загружен в контейнер, но не будет выполняться или заполнять базу данных при инициализации контейнера. Мой первоначальный docker-compose.yml выглядит следующим образом:
#docker-compose.yml
version: '3'
services:
db:
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d:
Я нашел два рабочих решения этой проблемы:
Первый пришел после того, как я вошел в работающий контейнер и подтвердил, что файл mydatabasedump.sq присутствовал и выполнялся в каталоге контейнера docker-entrypoint-initdb.d; Я создал и добавил
bash-скрипт в мой локальный каталог /config/mysql/data с именем dump.sh, который выполнялся после инициализации контейнера. Он содержит одну команду mysql, которая копирует my_database_dump.sql в my_app_database.
Сценарий bash выглядит следующим образом
#!/bin/bash
#dump.sh
mysql -uadmin -padmin my_app_database < my_database_dump.sql
#end of dump.sh
Я выполнил этот сценарий через свой Dockerfile в директиве ENTRYPOINT, например:
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dockerfile
После того, как начальная проблема возникла из-за того, что тома монтировались после сборки cotainer, и, следовательно, из-за того, что во время загрузки не использовалась база данных с файлом дампа (или не выполнялись какие-либо сценарии в этом каталоге), вторым решением было просто
переместите директиву volume в моем compose файле выше встроенной директивы. Это сработало и позволило мне удалить скрипт dump.sh и директиву DOCKERENTRY в моем Dockerfile.
Модифицированный docker-compose.yml выглядит следующим образом
#docker-compose.yml
version: '3'
services:
db:
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d
build: ./build/mysql/ #this is pointing to my Dockerfile
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin