基于Django的Docker项目Windows可连PostgreSQL,Mac/Linux认证失败
问题:跨平台Docker Django连接PostgreSQL密码认证失败
这个问题已经困扰近一个月,具体情况如下:
- 基于Django的Docker项目,在Windows机器上执行
docker compose build和docker compose up后,项目正常运行,Django可完美连接PostgreSQL数据库,已在两台Windows机器验证。 - 但在Mac或Linux机器上启动时,会出现
connection failed: FATAL: password authentication failed for the user "postgres"错误。 - 尝试将.env中的数据库凭证替换为AWS RDS实例的PostgreSQL信息,在Mac和Linux上可正常连接,推测问题可能与路径相关,但尚未找到解决方案。
相关配置文件
docker-compose.yml
version: '3.8' services: web: container_name: targeting build: ./Targeting command: python manage.py runserver 0.0.0.0:80 volumes: - ./:/usr/src/project/ ports: - "80:80" db: env_file: - ./.env restart: always image: postgres container_name: postgres environment: - POSTGRES_DB=${NAME} - POSTGRES_USER=${USER} - POSTGRES_PASSWORD=${PASSWORD} - POSTGRES_PORT=${PORT} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data/ pgadmin: image: dpage/pgadmin4 container_name: pgadmin4_container restart: always ports: - "8888:80" environment: PGADMIN_DEFAULT_EMAIL: user-name@domain-name.com PGADMIN_DEFAULT_PASSWORD: strong-password volumes: - pgadmin-data:/var/lib/pgadmin volumes: postgres_data: pgadmin-data:
.env
SECRET_KEY=random_secret_key DEBUG=TRUE NAME=postgres USER=postgres PASSWORD=password HOST=db PORT=5432
Python容器Dockerfile
# pull official base image FROM python:3.11.4-slim-buster # set work directory WORKDIR /usr/src/project # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # install dependencies RUN pip install --upgrade pip COPY ../requirements.txt . RUN pip install -r requirements.txt # copy project COPY .. .
Django settings.py 数据库配置
from decouple import config DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "NAME": config('NAME'), "USER": config('USER'), "PASSWORD": config('PASSWORD'), "HOST": config('HOST'), "PORT": config('PORT') } }
排查建议
- 清理PostgreSQL持久化卷:Mac/Linux上可能残留旧的卷数据导致认证异常,执行
docker compose down -v彻底删除所有卷,再重新构建启动。 - 检查.env文件换行符:Windows默认CRLF格式,Mac/Linux用LF,可能导致环境变量读取错误。将.env转换为LF格式后重试。
- 验证db容器环境变量:启动后进入db容器执行
echo $POSTGRES_PASSWORD,确认密码是否与.env一致,命令:docker exec postgres echo $POSTGRES_PASSWORD - 调整Dockerfile路径:docker-compose中web服务的build上下文是
./Targeting,Dockerfile里的COPY ../requirements.txt .属于跨目录拷贝,不同系统对相对路径解析可能有差异。建议将requirements.txt移到Targeting目录下,修改Dockerfile为COPY ./requirements.txt .和COPY . .。 - 确认Django配置读取:在settings.py中临时添加
print(config('PASSWORD')),启动后查看web容器日志,确认读取到的密码是否正确。
内容的提问来源于stack exchange,提问作者XzinkX
相关产品推荐
相关产品推荐

