我在使用docker-compose导入.sql转储文件时遇到问题。我已经关注了文档,这显然会从docker-entrypoint-initdb.d加载.sql文件。但是,当我运行docker-compose up
时,sql文件不会被复制到容器中。
我尝试用-vf
标志停止容器,但这也没有用。我在.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
答案 0 :(得分:21)
经过多次尝试卷设置后,我找到了解决方法
我在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
这样,转储总是被复制并在启动时运行
答案 1 :(得分:10)
这显示在Docker MySQL图像的文档页面上:https://hub.docker.com/_/mysql/
初始化新实例
第一次启动容器时,使用新的数据库 将使用提供的名称创建和初始化指定的名称 配置变量。此外,它将执行文件 在其中找到的扩展程序
.sh
,.sql
和.sql.gz
/docker-entrypoint-initdb.d。文件将按字母顺序执行 订购。您可以通过mounting a SQL dump into that directory轻松填充您的mysql服务 并提供custom images贡献 数据。默认情况下,SQL文件将导入指定的数据库 通过MYSQL_DATABASE
变量。
答案 2 :(得分:7)
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}
答案 3 :(得分:6)
这对我有用,
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文件都将导入。
答案 4 :(得分:1)
我也有这个问题。我在 ./mysql-dump 中通过 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
希望对你有帮助
答案 5 :(得分:0)
我在使用mysql时遇到类似的问题,我会通过docker-compose将包含mydatabasedump.sql文件的本地目录挂载在/ configs / mysql / data上,并放置到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脚本到我的本地/ configs / 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 Dokerfile
意识到最初的问题是由于在构建容器之后就将卷转移了,因此没有在启动时将数据库与转储文件一起使用(或在该目录中执行任何脚本),第二种解决方案是 将volumes指令在我的compose文件中移动到build指令上方。这有效并且允许我删除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