Me pasó. Configuré un servidor PostgreSQL en Docker hace meses, anoté la contraseña en algún lado que ahora no encuentro, y necesitaba acceder urgentemente. La solución es más simple de lo que parece, pero hay que hacerlo con cuidado para no borrar nada.
El problema#
Tienes un contenedor Docker con PostgreSQL corriendo, datos valiosos adentro, pero no recuerdas la contraseña del usuario postgres. Reiniciar el contenedor o reconstruir la imagen no es opción porque perderías todo.
La solución: Acceso local sin autenticación#
PostgreSQL tiene un mecanismo de autenticación llamado trust que permite conexiones locales sin contraseña. Vamos a usarlo temporalmente.
Paso 1: Identificar el contenedor#
docker ps | grep postgresAnota el ID o nombre del contenedor. En mi caso es postgres-server.
Paso 2: Acceder al contenedor#
docker exec -it postgres-server bashAhora estás dentro del contenedor como usuario root.
Paso 3: Editar pg_hba.conf#
Este archivo controla la autenticación de PostgreSQL. Necesitas cambiarlo temporalmente:
cat /var/lib/postgresql/data/pg_hba.confBusca las líneas que se ven así:
local all all md5
host all all 127.0.0.1/32 md5Edita el archivo (usa nano o vi):
nano /var/lib/postgresql/data/pg_hba.confCambia md5 por trust en las líneas locales. Debería verse así:
local all all trust
host all all 127.0.0.1/32 trustGuarda y sale (Ctrl+X, Y, Enter si usas nano).
Paso 4: Reiniciar PostgreSQL#
pg_ctl reload -D /var/lib/postgresql/dataSi eso no funciona, intenta:
su - postgres
psqlPaso 5: Cambiar la contraseña#
Una vez dentro de psql:
ALTER USER postgres WITH PASSWORD 'tu_nueva_contraseña_segura';Reemplaza tu_nueva_contraseña_segura con algo fuerte. Luego:
\qPaso 6: Restaurar la seguridad#
Vuelve a editar pg_hba.conf y cambia trust de vuelta a md5:
nano /var/lib/postgresql/data/pg_hba.confRestaura:
local all all md5
host all all 127.0.0.1/32 md5Guarda.
Paso 7: Recargar configuración#
pg_ctl reload -D /var/lib/postgresql/dataSale del contenedor:
exitVerificar que funciona#
docker exec -it postgres-server psql -U postgres -c "SELECT version();"Te pedirá la contraseña nueva. Si la acepta, todo está bien.
Notas importantes#
- No dejes
trustactivado en producción. Es una ventana abierta. - Los datos nunca se tocaron. Solo cambiaste el archivo de configuración.
- Este método funciona porque tienes acceso al sistema de archivos del contenedor. Si no puedes hacer
docker exec, necesitas otro enfoque. - Si usas volúmenes, asegúrate de que
pg_hba.confesté en el volumen persistente, no en la imagen.
Alternativa más rápida (si la imagen lo permite)#
Algunos Dockerfile de PostgreSQL tienen variables de entorno. Podrías recrear el contenedor con:
docker run -e POSTGRES_PASSWORD=nueva_contraseña -v postgres_data:/var/lib/postgresql/data postgresPero solo si usas un volumen nombrado. Si usas bind mounts, los datos estarán seguros igual.
Lección aprendida#
Desde entonces guardo las credenciales en un gestor de contraseñas y documento todo en un archivo cifrado dentro de mi servidor. Nada de notas sueltas.