Jenkins Docker实现自动复制MySQL数据库
需求
测试环境需要持续模拟生产环境的数据库,由于生产的数据库只能晚上复制,所以想写一个自动复制数据库的脚本,决定使用Jenkins的管道脚本,方便设置定时运行
Pipeline脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!groovy pipeline { agent any
stages { stage('clean') { steps { sh '((docker stop mysql_prod && docker rm mysql_prod) && echo "clean success") || echo "clean error"' } } stage('start') { steps { sh 'docker run --name mysql_prod -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=??? -e MYSQL_USER=??? -e MYSQL_PASSWORD=??? -e MYSQL_DATABASE=efi mysql:5.7.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci' } } stage('wait to start') { steps { sleep 10 } } stage('dump') { steps { sh 'docker exec mysql_prod sh -c "exec mysqldump -h??? -u??? -p??? efi > efi.sql"' } } stage('import') { steps { sh 'docker exec mysql_prod sh -c "exec mysql -u??? -p??? efi < efi.sql"' } } } }
|
clean
: 停止并删除老的数据库容器,因为测试用所以数据可以直接丢弃
start
: 运行一个新的数据库容器,指定root密码、管理用户的用户名密码、默认数据库名称等
wait to start
: 等待容器启动和初始化,一般10s就可以了,去掉这步后面的命令会有奇怪的问题
dump
: 使用mysqldump命令导出制定的数据源,-h可以指定远程数据库的host
import
: 使用mysql命令导入刚刚导出的sql文件到本地数据库
MySQL官方镜像的说明中推荐使用/docker-entrypoint-initdb.d
目录存放初始化的sql脚本,但是这种方法需要挂载目录到容器中,由于本人不喜欢做挂载目录(感觉会把宿主机弄脏),所以利用Jenkins的脚本做了以上的简单实现