You need to enable JavaScript to run this app. Docker Compose部署下Django无法连接Postgres 报admin角色不存在
优惠活动
大模型
产品
解决方案
定价
更多

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。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 22:36:04