Estou ciente da seguinte solução para o no pg_hba.conf entry for host
erro: connect to PostgreSQL server: FATAL: no pg_hba.conf entry for host
Mas eu me pergunto por que esse erro acontece ao usar a variável de ambiente Postgres POSTGRES_PASSWORD_FILE
no Docker, e não ao definir a senha diretamente com uma variável de ambiente como POSTGRES_PASSWORD
.
Aqui estão os bits de código mais úteis. Se você quiser ver um exemplo completo, dê uma olhada neste repositório .
Esta versão irá acionar o erro:
services:
database:
image: postgres:10
volumes:
- ./pass/db/db_pass:/run/secrets/db_pass:ro
- data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db_pass
Embora esta versão funcione bem:
services:
database:
image: postgres:10
volumes:
- data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=db_password
O ./pass/db/db_pass
arquivo contém exatamente a mesma senha: db_password
.
Basicamente, a única coisa que muda entre as duas configurações é que definir a senha para o container do banco de dados é 1) feito com uma variável de ambiente POSTGRES_PASSWORD
e 2) feito a leitura do arquivo apontado por POSTGRES_PASSWORD_FILE
, arquivo que é montado em bind dentro do container como read- só.
Se olharmos para o ponto de entrada do Postgres, POSTGRES_PASSWORD_FILE
é usado para preencher POSTGRES_PASSWORD
: https://github.com/docker-library/postgres/blob/master/10/docker-entrypoint.sh#L8-L24 .
# usage: file_env VAR [DEFAULT]
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
Não entendo por que o Postgres lança esse no pg_hba.conf entry for host
erro se o banco de dados foi criado corretamente com a senha fornecida.
Olhando para o ponto de entrada, a configuração deve ser exatamente a mesma, mas verifiquei com o comando docker-compose -f no-file.yml run --rm database /bin/bash -c 'cat $PGDATA/pg_hba.conf'
e a linha host all all all md5
não aparece na configuração usando POSTGRES_PASSWORD_FILE
.
Por que a configuração padrão muda quando usamos a POSTGRES_PASSWORD_FILE
variável e como corrigir isso de forma elegante? Preciso fornecer um arquivo de configuração personalizado do Postgres conforme descrito em https://hub.docker.com/_/postgres/ , seção "Configuração do banco de dados"?
Foi um problema de permissão.
Meu arquivo de senha tinha
-rw-------
permissões. Como odocker-entrypoint.sh
script define a-e
opção, ele estava saindo mais cedo, logo após esse erro, impedindo de anexar ahost all all all md5
linha aopg_hba.conf
.Eu adicionei
r
para grupo e outros, bem comor-x
para grupo e outros em seu diretório pai. Isso resolveu o problema.