--- title: Jenkins Docker实现自动复制MySQL数据库 date: 2018-07-23 14:37:33 description: Jenkins的管道脚本,实现自动复制MySQL数据库到Docker容器(测试环境) categories: [技术总结] tags: [Jenkins, Docker, MySQL] --- ## 需求 > 测试环境需要持续模拟生产环境的数据库,由于生产的数据库只能晚上复制,所以想写一个自动复制数据库的脚本,决定使用Jenkins的管道脚本,方便设置定时运行 ### Pipeline脚本 ```groovy #!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官方镜像](https://hub.docker.com/_/mysql)的说明中推荐使用`/docker-entrypoint-initdb.d`目录存放初始化的sql脚本,但是这种方法需要挂载目录到容器中,由于本人不喜欢做挂载目录(感觉会把宿主机弄脏),所以利用Jenkins的脚本做了以上的简单实现