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 或在啟動容器的時候加入,賦給跨容器的權限。如下圖


浙公網安備 33010602011771號