主机Django连接Docker容器内PostgreSQL密码验证失败求助
问题:Django连接Docker中PostgreSQL密码认证失败
环境配置
docker-compose.yml配置
postgres: image: postgres:13.0-alpine volumes: - postgres:/var/lib/postgresql/data ports: - "5432:5432" env_file: - $ENV_FILE pgadmin: image: dpage/pgadmin4 volumes: - pgadmin:/var/lib/pgadmin ports: - "${PGADMIN_PORT:-5050}:80" restart: unless-stopped depends_on: - postgres env_file: - $ENV_FILE
Django数据库配置
DATABASES = { "default": { "ENGINE": os.environ.get("POSTGRES_ENGINE", "django.db.backends.postgresql"), "NAME": os.environ.get("POSTGRES_NAME", "postgres"), "USER": os.environ.get("POSTGRES_USER", "admin"), "PASSWORD": os.environ.get("POSTGRES_PASS", "admin"), "HOST": os.environ.get("POSTGRES_HOST", "127.0.0.1"), "PORT": os.environ.get("POSTGRES_PORT", "5432"), } }
错误信息
Traceback (most recent call last): File "C:\Users\liam.obrien\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner self.run() File "C:\Users\liam.obrien\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run self._target(*self._args, **self._kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\channels\management\commands\runserver.py", line 76, in inner_run self.check_migrations() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\core\management\base.py", line 576, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\migrations\loader.py", line 58, in __init__ self.build_graph() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\migrations\recorder.py", line 81, in applied_migrations if self.has_table(): File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\migrations\recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\base\base.py", line 284, in cursor return self._cursor() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\base\base.py", line 260, in _cursor self.ensure_connection() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\base\base.py", line 243, in ensure_connection with self.wrap_database_errors: File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\base\base.py", line 244, in ensure_connection self.connect() File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\base\base.py", line 225, in connect self.connection = self.get_new_connection(conn_params) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\django\db\backends\postgresql\base.py", line 203, in get_new_connection connection = Database.connect(**conn_params) File "C:\Users\liam.obrien\AppData\Local\pypoetry\Cache\virtualenvs\tdd-framework-FOYpVOaj-py3.10\lib\site-packages\psycopg2\__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: connection to server at "127.0.0.1", port 5432 failed: FATAL: password authentication failed for user "admin"
排查与解决步骤
统一环境变量键名
PostgreSQL官方镜像要求的密码环境变量是POSTGRES_PASSWORD,而你的Django配置中用的是POSTGRES_PASS。确保.env文件中同时包含匹配的键值对,或者统一键名:- 方式1:修改Django配置,将
POSTGRES_PASS改为POSTGRES_PASSWORD,保证和PostgreSQL镜像的环境变量一致:"PASSWORD": os.environ.get("POSTGRES_PASSWORD", "admin"), - 方式2:在.env文件中同时添加
POSTGRES_PASSWORD和POSTGRES_PASS,值保持一致。
- 方式1:修改Django配置,将
验证本地环境变量是否加载
在Django配置文件中临时添加打印语句,确认运行Django时是否正确读取到环境变量:import os print("POSTGRES_USER:", os.environ.get("POSTGRES_USER")) print("POSTGRES_PASSWORD:", os.environ.get("POSTGRES_PASSWORD")) # 或POSTGRES_PASS启动Django服务器,查看控制台输出,如果显示的是默认值
admin,说明本地终端未正确加载.env文件,需要手动加载(比如用source .env命令,或者使用dotenv库自动加载)。检查PostgreSQL容器内的用户配置
进入PostgreSQL容器,验证用户和密码是否正确:- 执行
docker exec -it <你的postgres容器ID> bash进入容器 - 执行
psql -U <POSTGRES_USER> -d <POSTGRES_NAME>,输入.env中的密码,看能否成功登录。如果登录失败,说明容器启动时未正确读取.env变量。
- 执行
清理旧卷数据(若存在配置残留)
如果之前修改过.env但未清理卷,PostgreSQL会保留旧的用户配置:- 停止容器:
docker-compose down - 查看并删除postgres卷:
docker volume ls找到对应卷名,执行docker volume rm <卷名> - 重新启动容器:
docker-compose up -d
- 停止容器:
内容的提问来源于stack exchange,提问作者liam
相关产品推荐
相关产品推荐

