docker初始化mysql数据及数据持久化
docker mysql初始化数据及数据持久化
1.初始化默认数据
原理
当Mysql容器首次启动时,会在 /docker-entrypoint-initdb.d/目录下扫描 .sh、.sql、.sql.gz类型的文件。如果这些类型的文件存在,将执行它们来初始化一个数据库。这些文件会按照字母的顺序执行。默认情况下它们会初始化在启动容器时声明的 MYSQL_DATABASE变量定义的数据库中,例如下面的命令会初始化一个REGION_DB 数据库:
docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
如果你的启动命令没有指定数据库那么就必须在数据库DDL脚本中声明并指定使用该数据库。否则就会实现下面的异常:
ERROR 1046 (3D000) at line 7: No database selected
操作
我们经常会在mysql容器启动时,需要初始化一些数据库、数据表或者其他默认数据。其实mysql早已支持我们这种需求,具体方案如下:
# 其实主要的做法就是重新build mysql镜像
# 新建Dockerfile
FROM mysql:5.7
COPY sql/*.sql /docker-entrypoint-initdb.d/
# gantt.sql文件
create database `gantt` default character set utf8 collate utf8_general_ci;
# build镜像(tag需要更新为自己需要镜像tag)
docker build -t tag .
2.mysql数据持久化
数据持久化主要是将mysql中的数据内容映射到宿主机,从而保证数据的可以永久保存(down - v 后数据依然在),如果需要完全迁移数据,则需要将映射在宿主机的文件一并迁移。docker-compose.yml文件配置如下:
version: '2.3'
services:
schedule-mysql:
image: hub.infervision.com/dev/viewer-collection:schedule-mysql-5.7
restart: always
ports:
- 3311:3306
volumes:
- ./mysql_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=gantt
- MYSQL_PASSWORD=gantt