Java 之跨docker容器备份数据库
Java 之跨docker容器备份数据库
摘】
java中执行数据库备份,每隔10分钟备份一次,保留四份备份文件,项目在windows系统下运行备份命令没问题。项目采用docker部署后,jar部署在一个docker容器简称“jar 容器”,mysql部署在另外一个docker容器简称“mysql容器”。备份命令却在mysql容器中才能执行,但是项目运行却在jar容器中调用备份命令。
容】
1、定时任务10分钟执行一次
public void timeBackupBase()
{
// 使用Docker CLI命令进行数据库备份%s 是占位符 ,nsenter 可以执行另外一个容器的命令
String dockerCmd = "nsenter -m -u -i -n -p -t 1 docker exec %s mysqldump -u%s -p%s --databases %s > %s";
Map<String, String> dbInfo = jts.getDBInfo();
String username = dbInfo.get("userName");
String password = dbInfo.get("passWord");
String database = dbInfo.get("dbName");
File dataFile = new File(backUpPath + System.currentTimeMillis() + ".sql");
// 构建命令字符串 polo-mysql 替换成你的容器名 数据库用户名:username 数据库密码password 数据库名称:database 文件路径dataFile
dockerCmd = String.format(dockerCmd, "polo-mysql", username, password, database, dataFile);
// 执行命令
try {
System.out.println("======开始执行备份命令:======="+dockerCmd);
Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c", dockerCmd});
process.waitFor();
System.out.println("======执行结果值:======="+process.exitValue());
// 检查备份是否成功
if (process.exitValue() == 0) {
System.out.println("数据库备份成功。");
} else {
System.err.println("数据库备份失败。");
}
} catch (Exception e) {
e.printStackTrace();
}
}
再做这个之前,要在你的docker-compose.yml文件中加入 privileged: true pid: host 或在启动容器的时候加入,赋给跨容器的权限。如下图