Docker Compose部署下Django无法连接Postgres 报admin角色不存在
问题根因
- Postgres 官方镜像仅在数据目录为空时执行初始化,且只识别固定名称的环境变量:
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB。你当前配置的POSTGRES_USERNAME、POSTGRES_DBNAME不符合规范,无法被镜像识别。 docker-compose.yml中的database服务未配置env_file,完全没有加载database.env的配置,启动时使用默认参数仅创建了内置的postgres用户,不存在你配置的admin角色。- 持久化卷
database-data会缓存已初始化的数据库数据,即使后续修改配置,只要卷非空就不会触发重新初始化,旧的无效数据会一直存在。
分步解决方案
1. 修正环境变量命名
替换 database.env 中不符合Postgres镜像规范的变量:
# database.env POSTGRES_USER=admin POSTGRES_PASSWORD=pass POSTGRES_DB=db # 以下为web服务所需的配置,保持原有逻辑即可 PGUSER=admin PGPASSWORD=pass PGDATABASE=db PGHOST=database PGPORT=5432 DATABASE=db SQL_HOST=database SQL_PORT=5432
web服务自定义的 POSTGRES_HOST、POSTGRES_PORT 可保留,不会影响Postgres镜像运行
2. 给数据库服务挂载环境变量文件
修改 docker-compose.yml 的 database 服务配置,新增 env_file 字段:
database: container_name: database image: postgres volumes: - database-data:/var/lib/postgresql/data/ ports: - 5432:5432 env_file: - database.env
3. 清理旧数据并重建容器
旧持久化卷的无效数据会阻止配置生效,必须先删除卷再启动:
# 停止容器并删除关联的持久化卷 docker-compose down -v # 重新构建启动所有服务 docker-compose up -d --build
4. 验证运行状态
查看数据库日志确认无报错:
docker logs database
正常启动后日志会输出初始化完成的信息,不会再出现 Role "admin" does not exist 的报错。
可选优化:web服务的Alpine镜像默认未安装
netcat,会导致entrypoint.sh中的nc命令无法执行,一直卡在等待数据库启动的逻辑。可在web服务的Dockerfile的apk依赖安装步骤中新增:RUN apk add --update netcat-openbsd
内容的提问来源于stack exchange,提问作者Peter。
相关产品推荐
相关产品推荐

