Eu tenho dois contêineres Docker com um banco de dados Postgres em cada um. Estou expondo o soquete Postgres de cada contêiner ao outro, usando volumes Docker, assim:
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
O acima faz com que no contêiner eu tenha o soquete regular /var/run/postgresql
, bem como o soquete/var/run/postgresql_containertwo
Meu objetivo é poder consultar cada contêiner de dentro do outro, usando o método de autenticação de pares Postgres (ou seja, sem necessidade de senha).
Consegui fazer isso ao consultar por meio de javascript. Aqui está meu código, usando o pacote Sequelize do contêiner um para consultar o contêiner dois:
const sequelize_containertwo = new Sequelize('containertwo', 'myuser', undefined, {
host: '/var/run/postgresql_containertwo',
dialect: 'postgres'
});
Como você pode ver, a senha permanece indefinida. Contanto que o soquete esteja no sistema operacional e eu esteja usando o usuário correto do sistema operacional, o método de autenticação de ponto funciona e posso consultar o outro contêiner.
Mas também tenho funções PL/pgSQL e preciso consultar o outro contêiner dentro dessas funções. E é aqui que estou enfrentando um problema. De dentro das funções, estou consultando o mesmo contêiner, mas também preciso consultar dados do outro contêiner.
Para conseguir isso, meu primeiro pensamento foi usar o dblink. Tentei fazer algo assim:
SELECT *
FROM dblink('postgresql:///containertwo_db?host=/var/run/postgresql_containertwo',
SELECT mycol
FROM mytable
)
AS t1(mycol BIGINT);
Isso fornece o host como um parâmetro na cadeia de conexão. Já tive sucesso ao me conectar ao soquete usando exatamente essa string de conexão, mas a partir do arquivo docker_entrypoint. Quando tento no dblink, recebo o erro de que é necessária uma senha.
Como posso consultar o outro contêiner de dentro de uma função PL/pgSQL e usando autenticação de pares? Posso fazer isso através do dblink e, em caso afirmativo, como? Ou existe alguma outra maneira?
Consegui fazer isso via postgres_fdw .
Este artigo descreve o processo.
Aqui estão meus passos:
Isso funciona e posso consultar tabelas do banco de dados do próprio contêiner ou do banco de dados de outro contêiner, com um usuário não superusuário, sem precisar de autenticação por senha.