Docker Compose mysql import.sql
我无法使用docker compose导入.sql转储文件。我遵循了文档,它显然将从docker entrypoint initdb.d加载.sql文件。但是,当我运行Docker Compose mysql import.sql,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,我无法使用docker compose导入.sql转储文件。我遵循了文档,它显然将从docker entrypoint initdb.d加载.sql文件。但是,当我运行docker compose up时,sql文件不会复制到容器中 我尝试过用-vf标志停止容器,但也没有成功。我的.yml脚本是否有问题 我的compose文件所在的根目录database/db dump/中有dump.sql frontend: image: myimage ports: - "80:80" l
docker compose up
时,sql文件不会复制到容器中
我尝试过用-vf
标志停止容器,但也没有成功。我的.yml脚本是否有问题
我的compose文件所在的根目录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
然后从compose中删除卷并运行新映像
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映像的文档页面上: 初始化新实例 当容器第一次启动时,一个新的数据库 将创建指定的名称,并使用提供的 配置变量。此外,它将使用 可在中找到的扩展名
.sh
、.sql
和.sql.gz
/docker入口点initdb.d。文件将按字母顺序执行
秩序。您可以通过以下方式轻松填充mysql服务:
并提供
数据。默认情况下,SQL文件将导入指定的数据库
通过MYSQL\u数据库
变量
Mysql数据库转储schema.sql位于/Mysql转储/schema.sql目录中,它在初始化过程中创建表 docker-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}
这对我很有效
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转储必须是一个目录。目录中的所有.sql都将被导入。我在mysql中遇到了类似的问题,我将通过docker compose在/configs/mysql/data处装载一个本地目录,其中包含一个mydatabasedump.sql文件,并将其装载到docker入口点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:
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dockerfile
我找到了两种解决此问题的有效方法:
第一个是在我登录正在运行的容器并确认mydatabasedump.sq文件存在并且可在容器的docker entrypoint initdb.d目录中执行之后;我创建并添加了
初始化容器后执行的本地/configs/mysql/data目录dump.sh的bash脚本。它包含一个mysql命令,将my_database_dump.sql复制到my_app_数据库。
bash脚本如下所示
#!/bin/bash
#dump.sh
mysql -uadmin -padmin my_app_database < my_database_dump.sql
#end of dump.sh
#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
在意识到最初的问题是由于在构建cotainer之后安装了卷,因此在引导时没有使用转储文件初始化数据库(或在该目录中执行任何脚本),第二个解决方案就是
将我的撰写文件中的volumes指令移到Build指令上方。这起了作用,允许我删除Dockerfile中的dump.sh scrip和DOCKERENTRY指令。
修改后的docker-compose.yml如下所示
#!/bin/bash
#dump.sh
mysql -uadmin -padmin my_app_database < my_database_dump.sql
#end of dump.sh
#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
我也有这个问题。我通过docker compose将包含init.sql文件的本地目录装载到docker entrypoint initdb.d卷的./mysql dump,该文件将加载到容器中,但在容器初始化时不会执行或填充数据库。 我的初始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:
#Dockerfile
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
#end of Dockerfile
mysqld:
图片:mysql
容器名称:mysqld
卷数:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/my.cnf
-./init:/docker入口点initdb.d
环境文件:.env
重新启动:始终
环境:
-MYSQL\u ROOT\u密码=123456
-MYSQL_数据库=fendou
命令:--字符集服务器=utf8mb4--排序规则服务器=utf8mb4\U unicode\U ci
--默认身份验证插件=mysql\u本机\u密码
但这对我不起作用。
我找到了解决这个问题的另一个有效方法:
将--init file/data/application/init.sql
添加到mysql命令中
mysqld:
图片:mysql
容器名称:mysqld
卷数:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/my.cnf
#-./init:/docker入口点initdb.d
环境文件:.env
重新启动:始终
环境:
-MYSQL\u ROOT\u密码=123456
-MYSQL_数据库=fendou
命令:--字符集服务器=utf8mb4--排序规则服务器=utf8mb4\U unicode\U ci
--默认身份验证插件=mysql\u本机\u密码
--init file/docker-entrypoint-initdb.d/init.sql#注意这里
希望对您有所帮助您的docker compose正在我的机器上工作。请附上主机上转储位置的目录结构,以及如何检查复制到容器中的文件。目录结构为“数据库>数据库转储>转储.sql”一旦编写完成mysql容器的连接,并检查docker entrypoint initdb.d dir,该dir始终为空/docker entrypoint initdb.d仅在创建容器时读取。OP在运行docker compose up时要求数据库“更新”。你应该看看:等等,没有理由仅仅为了导入一些文件而构建一个新映像:只有在数据永远不变的情况下才有意义,而且你正在将映像共享给同事,所以他们不需要每次都导入该文件。但是在正常情况下,使用卷是可以采用的解决方案。请记住,您的SQL语句可能需要
CREATE DATABASE[name]
和USE[name]
语句,您可以确认您的SQL文件将与docker exec-i[container\u id]sh-c'exec mysql-uroot-p“[password]”一起工作。
,如果它在这里工作,它应该在您的docker文件中工作。谢谢!这对我有帮助,而其他人没有。