我想將選定的資料庫匯出到容器中。當使用 shells 命令時,我使用這個
kubectl exec -it pg-container -n data-prod -- /bin/bash -c "pg_dump -U nsc -d nsc -n public -f nsc.sql"
當 data-prod 是命名空間并且 pg-container 是具有 PostgreSQL 資料庫的容器時。
該命令在 shell 中運行良好。但我想使用 ProcessBuilder 在 Java 中執行這個命令。
java中的實作是這樣的:
public class ExportDBInfo {
String dbname;
String schemaname;
ArrayList<String> tablesname;
String dbuser;
String output;
}
for (ExportDBInfo dbinfo : Array_db_info){
String export_database_cmd = String.format("kubectl exec -it pg-container -n data-prod -- /bin/bash -c \"pg_dump -U %s -d %s -n %s %s -f %s.sql\"",dbinfo.dbuser,dbinfo.dbname,dbinfo.schemaname,query_tables,dbinfo.output);
ProcessBuilder pb = new ProcessBuilder(export_database_cmd);
pb.start().waitFor();
}
但這不起作用。我想知道我的實作中是否有一些錯誤。非常感謝!
uj5u.com熱心網友回復:
Java 不是 bash 或 shell。你真的不想使用exec,它的規則有點奇怪。它非常隨意地嘗試分割空間。
相反,使用ProcessBuilder, 并指定引數串列,而不是單個字串變體。
整個 pg_dump 東西是一個單獨的引數,不應該包含引號 - 這些引號被 bash “吃掉”并告訴 bash 將其全部視為一個單獨的引數;java 不是 bash,只是盲目地將它們傳遞給不知道它意味著什么的 kubectl 工具。
所有其他引數(包括--)都是他們自己的東西。
所以..
List.of("/bin/kubectl", "exec", "-it", "pg-container", "-n", "data-prod", "--", "/bin/bash", "-c", String.format("pg_dump -U %s -d %s -n %s %s -f %s.sql", dbinfo.dbuser, dbinfo.dbname, dbinfo.schemaname, query_tables, dbinfo.output));
并將其傳遞給ProcessBuilder.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/454105.html
