[英]Docker Compose mysql import .sql
我在使用 docker-compose 导入 .sql 转储文件时遇到问题。我已经按照文档进行操作,显然将从 docker-entrypoint-initdb.d 加载 .sql 文件。 但是,当我运行docker-compose up
,sql 文件不会复制到容器中。
我试过使用-vf
标志停止容器,但这也没有用。 我在 my.yml 脚本中做错了什么吗?
我在我的撰写文件所在的根目录 database/db-dump/ 中有 dump.sql。
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
经过多次尝试卷设置后,我找到了一种解决方法
我在Dockerfile中使用以下内容创建了另一个基于mysql的图像
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
这样,转储总是被复制并在启动时运行
这出现在Docker MySQL图像的文档页面上: https : //hub.docker.com/_/mysql/
初始化一个新实例
首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。 此外,它将执行扩展名为
.sh
,.sql
和.sql.gz
文件,这些文件位于/docker-entrypoint-initdb.d中。 文件将按字母顺序执行。 您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充您的mysql服务。 默认情况下,SQL文件将导入到MYSQL_DATABASE
变量指定的数据库中。
这对我有用,
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。
Mysql数据库转储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}
我也有这个问题。 我通过 docker-compose 将包含 init.sql 文件的本地目录挂载到 docker-entrypoint-initdb.d 卷,该文件将加载到容器中,但在容器初始化时不会执行或填充数据库. 我的初始 docker-compose.yml 看起来像这样:
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
- ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
但它对我不起作用。 我找到了解决此问题的另一个有效解决方案:将--init-file /data/application/init.sql
添加到 mysql command.change 上面的配置,如
mysqld:
image: mysql
container_name: mysqld
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/my.cnf
# - ./init:/docker-entrypoint-initdb.d
env_file: .env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=fendou
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
--default-authentication-plugin=mysql_native_password
--init-file /docker-entrypoint-initdb.d/init.sql #attention here
希望对你有帮助
我有一个与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目录中可执行之后。 我创建并在我的local / configs / mysql / data目录中添加了一个bash脚本,该目录名为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
我通过ENTRYPOINT指令中的Dockerfile执行了这个脚本,如下所示:
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dokerfile
在意识到最初的问题是由于在构建cotainer之后对卷进行了调整,因此在启动时没有使用转储文件(或在该目录中执行任何脚本)来使用数据库,第二个解决方案只是移动卷指令在构建指令上面的compose文件中。 这工作,并允许我删除我的Dockerfile中的dump.sh脚本和DOCKERENTRY指令。 修改后的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
我想保留容器的原始设置,所以我尝试在已经运行的容器上进行恢复。 这似乎有效:
cat dump.sql | docker-compose exec -T db mysql -h localhost -u root -psomewordpress -v
但它非常慢,冗长的 output 似乎被缓冲了,所以我尝试了:
docker-compose cp dump.sql db:/tmp/
docker-compose exec db sh -c "mysql -h localhost -u root -psomewordpress -v < /tmp/dump.sql"
这至少提供了更快的反馈。
可能对某人有用? 看起来它很慢,因为我在转储上使用了--skip-extended-insert
,没有扩展插入它运行得更快
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.