山东前网站建设,网站背景色,怎样看网站的浏览量,百度广告投放平台叫什么1. 前言 Docker在开发中使用的越来越多了#xff0c;最近搞了一个Spring Boot应用#xff0c;为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢#xff1f; 我这里有两个传统方案。 第一种方案是在容器启动后手动导入#xff0c;太low了不行。第二… 1. 前言 Docker在开发中使用的越来越多了最近搞了一个Spring Boot应用为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢 我这里有两个传统方案。 第一种方案是在容器启动后手动导入太low了不行。第二种在Spring Boot客户端连接Mysql容器时初始化数据库你可以参考使用flyway进行数据库版本控制一文但是这依赖客户端的能力。能不能做到Mysql容器启动时就自己初始化数据库呢当然可以今天就来演示一下。全部代码见文末。 2.原理 当Mysql容器首次启动时会在 /docker-entrypoint-initdb.d目录下扫描 .sh.sql.sql.gz类型的文件。如果这些类型的文件存在将执行它们来初始化一个数据库。这些文件会按照字母的顺序执行。默认情况下它们会初始化在启动容器时声明的 MYSQL_DATABASE变量定义的数据库中,例如下面的命令会初始化一个REGION_DB 数据库 $ docker run --name some-mysql -e MYSQL_DATABASEREGION_DB -d mysql:tag 如果你的启动命令没有指定数据库那么就必须在数据库DDL脚本中声明并指定使用该数据库。否则就会实现下面的异常 ERROR 1046 (3D000) at line 7: No database selected那么接下来我们将利用这一机制来实现Docker容器启动时初始化数据库。 3.自定义Dockerfile 我们编写自己的Dockerfile来实现我们的需求这里以 Mysql:5.7 为例。不同的版本可能有一定的出入需要详细去阅读官方文档。脚本如下 FROM mysql:5.7
LABEL OGfelord.cn
COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf
COPY ./sql /tmp/sql
RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d
RUN rm -rf /tmp/sql 第一步引入官方 Mysql:5.7 Docker镜像。第二步无实际意义主要是作者、组织信息。第三步很重要本来我没有配置第三行结果运行容器后发现初始化数据的中文全部乱码了。所以需要在初始化数据库前修改Mysql的编码等配置这里我顺便把时区也改为了8:00。第四步复制包含数据库脚本的 ./sql文件夹到镜像的/tmp/sql下。第五步使用 mv 命令把第四步拷贝的文件夹下的所有.sql文件复制到 /docker-entrypoint-initdb.d下这样才能利用2.章节的机制进行初始化数据库。第六步删除使用过的临时目录。然后你可以通过构建镜像命令构建自定义的Mysql镜像 # 一定不要忘记最后的一个 . 点
docker build -t mysql:5.7c . 通过mysql:5.7c镜像启动一个名称为mysql-service的容器root密码为123456,并持久化数据到宿主机 D:/mysql/data下 docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7c 小贴士你可以通过 SHOW VARIABLES LIKE character% 查看字符集是否更改为utf8mb4,也可以通过SHOW VARIABLES LIKE %time_zone% 查看时区是否是东八区。 4. 总结 今天我们自定义一个可以执行初始化数据库的Mysql镜像方便我们进行部署。你也可以参考这个思路来定制其它一些自己需要的Docker镜像。本文的完整Demo可通过我个人博客获取。 关注微信公众号Felordcn 获取更多干货