我有两个 Docker 容器,每个容器都有一个 Postgres 数据库。我使用 Docker 卷将每个容器的 Postgres 套接字暴露给另一个容器,如下所示:
docker run --rm -itd --name=containerone -p 127.0.0.1:3003:3000 -v containeronepgsocket:/var/run/postgresql -v containertwopgsocket:/var/run/postgresql_containertwo registry.gitlab.com/mycont/mycont
上面的内容使得在容器中我有常规套接字/var/run/postgresql
以及套接字/var/run/postgresql_containertwo
我的目标是能够使用 Postgres 对等身份验证方法(即不需要密码)从另一个容器中查询每个容器。
我在通过 javascript 查询时成功实现了这一点。这是我的代码,使用容器一内的 Sequelize 包来查询容器二:
const sequelize_containertwo = new Sequelize('containertwo', 'myuser', undefined, {
host: '/var/run/postgresql_containertwo',
dialect: 'postgres'
});
如您所见,密码保持未定义状态。只要套接字位于操作系统中,并且我使用正确的操作系统用户,对等身份验证方法就可以工作,并且我能够查询其他容器。
但我也有 PL/pgSQL 函数,并且我需要从这些函数中查询其他容器。这就是我遇到问题的地方。在函数内,我正在查询同一个容器,但我还需要查询另一个容器中的数据。
为了实现这一点,我的第一个想法是使用 dblink。我尝试做这样的事情:
SELECT *
FROM dblink('postgresql:///containertwo_db?host=/var/run/postgresql_containertwo',
SELECT mycol
FROM mytable
)
AS t1(mycol BIGINT);
这将主机作为连接字符串中的参数提供。我已经成功使用此连接字符串但从 docker_entrypoint 文件连接到套接字。当我在 dblink 中尝试时,收到需要密码的错误。
如何从 PL/pgSQL 函数中查询其他容器并使用对等身份验证?我可以通过 dblink 来完成吗?如果可以,怎么做?或者还有其他办法吗?
我能够通过postgres_fdw完成此任务。
本文描述了该过程。
这是我的步骤:
这是可行的,我可以使用非超级用户从自己的容器的数据库或其他容器的数据库中查询表,而无需密码身份验证。