我有两个 Docker 容器。一种是运行 Spring Boot 应用程序。另一个正在运行 Postgres。
我正在尝试以可以导入 pandas 的格式从 Postgres 获取三个表到 Java 服务器上(CSV,很可能?),但我遇到了困难。
我无法使用 ProcessBuilder 运行 pg_dump 或 psql,因为它们在 Java 映像中不可用。
我知道有一种方法可以使用安装在主机上的 docker 可执行文件和套接字,但这是一个后勤问题,因为许多现有服务器已经配置。最好在代码中解决这个问题,而无需更改操作系统或 docker-compose.yml。
我以为我可以使用 Postgres COPY 查询,但它似乎是将文件写入 Postgres 容器的硬盘驱动器,而不是 Java 容器的硬盘驱动器。
有什么方法(scp?ftp?)将复制的文件从一个容器传输到另一个容器吗?
也许两个容器之间的共享卷可以工作,但这需要手动编辑所有已部署服务器的 docker-compose.yml。
如何仅使用 Java 代码将这些表的 CSV 转储(或任何其他 pandas 友好的格式)从 Postgres 容器转移到 Java 容器?
事实证明,COPY 查询可用于将数据获取到客户端。您指定 STDOUT,而不是文件。请注意,您必须使用 CopyManager 而不是 Statement。
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class));
try (PrintWriter writer = new PrintWriter(new FileWriter(filePath))) {
copyManager.copyOut("COPY " + tableName + " TO STDOUT WITH (FORMAT CSV, HEADER)", writer);
}