Estoy tratando de configurar POSTGRES_USER y POSTGRES_PASSWORD con una configuración de postgres de docker usando los archivos pg_hba.conf y postgresql.conf :
docker run --name pg \ -e POSTGRES_USER=myUser \ -e POSTGRES_PASSWORD=myPassword \ -e POSTGRES_DB=myDb \ -v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \ -v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \ --network data-talk \ -d postgres \ -c config_file=/etc/postgresql/postgresql.conf \ -c hba_file=/etc/postgresql/pg_hba.conf pg_hba.conf # "local" is for Unix domain socket connections only local all all scram-sha-256 # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 host all all 172.19.0.0/16 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all scram-sha-256 host replication all 127.0.0.1/32 scram-sha-256 host replication all ::1/128 scram-sha-256 postgresql.conf listen_addresses = '*' password_encryption = 'scram-sha-256' # md5 or scram-sha-256Desde aquí https://hub.docker.com/_/postgres
Nota 1: la imagen de PostgreSQL configura la autenticación de
trustlocalmente, por lo que puede notar que no se requiere una contraseña cuando se conecta desdelocalhost(dentro del mismo contenedor). Sin embargo, se requerirá una contraseña si se conecta desde un host/contenedor diferente.
Quiero solicitar una contraseña en cualquier/todas las conexiones, incluida la local. Al cambiar pg_hba.conf , pensé que podría cumplir con esta solicitud. Estoy usando 172.19.0.0/16 ya que esta es la subred para la red docker.
Cuando ejecuto el comando docker anterior, verifico los registros para encontrar este psql: error: could not connect to server: FATAL: password authentication failed for user “myUser” .
¿Alguna idea sobre cómo hacer que esto funcione? yo también he intentado
docker run --name pg \ -e POSTGRES_PASSWORD=password \ -v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \ -v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \ --network data-talk \ -d postgres \ -c config_file=/etc/postgresql/postgresql.conf \ -c hba_file=/etc/postgresql/pg_hba.confque se ejecuta hasta el final, pero los errores cuando intento iniciar sesión localmente:
$ docker exec -it pg sh psql -U postgres Password for user postgres: psql: error: could not connect to server: FATAL: password authentication failed for user "postgres"Siguiendo aquí https://github.com/docker-library/postgres/blob/master/12/docker-entrypoint.sh#L202 Supongo que en la primera ejecución y configuración de la base de datos, el método de autenticación es md5 , y cuando Una vez hecho esto, el archivo pg_hba.conf lo establece en scram-sha-256 , por lo que no puede autenticarse.
Al configurar POSTGRES_INITDB_ARGS y pasar los parámetros para configurar el método de autenticación inicial en scram-sha-256 la contraseña se establece con scram-sha-256 para la inicialización de la base de datos, y simplemente funciona.
docker run --name pg \ -e POSTGRES_USER=myUser \ -e POSTGRES_PASSWORD=myPassword \ -e POSTGRES_DB=myDb \ -e POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256 --auth-local=scram-sha-256" \ -v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \ -v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \ --network data-talk \ -d postgres \ -c config_file=/etc/postgresql/postgresql.conf \ -c hba_file=/etc/postgresql/pg_hba.confPOSTGRES_INITDB_ARGSEsta variable de entorno opcional se puede usar para enviar argumentos a
postgres initdb. El valor es una cadena de argumentos separados por espacios como los esperaría postgres initdb. Esto es útil para agregar funciones como sumas de verificación de páginas de datos: -e POSTGRES_INITDB_ARGS="--data-checksums"
La clave aquí está en initdb
Lo que falta es que inicialmente no hay contraseñas establecidas para los usuarios, por lo que se ha bloqueado con ese pg_hba.conf .
Debe iniciar el servidor PostgreSQL y establecer una contraseña para el superusuario de postgres . Si desea vivir de forma segura, también debe crear al menos un no superusuario que tenga una contraseña.
La forma más sencilla de hacerlo es probablemente iniciar PostgreSQL en modo de usuario único con la opción --single (consulte la documentación para obtener más detalles). Eso tiene la ventaja de que se ignora pg_hba.conf y se le conecta automáticamente como superusuario de arranque.