You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用env_file配置PostgreSQL环境变量时Docker-Compose报错

Docker Compose配置PostgreSQL环境变量报错解决

错误信息

执行docker-compose build时出现以下错误:

time="2023-10-16T16:43:46-04:00" level=warning msg="The \"PGUSER\" variable is not set. Defaulting to a blank string."
time="2023-10-16T16:43:46-04:00" level=warning msg="The \"PGPASSWORD\" variable is not set. Defaulting to a blank string."
time="2023-10-16T16:43:46-04:00" level=warning msg="The \"PGDATABASE\" variable is not set. Defaulting to a blank string."
time="2023-10-16T16:43:46-04:00" level=warning msg="The \"PGPORT\" variable is not set. Defaulting to a blank string."
time="2023-10-16T16:43:46-04:00" level=warning msg="The \"PGPORT\" variable is not set. Defaulting to a blank string."
1 error(s) decoding:

* error decoding 'ports': No port specified: :<empty>

现有配置文件

docker-compose.yml

version: "3.11"
services:
 app:
  container_name: app_container
  build: .
  volumes:
   - .:/django
  ports:
   - 8000:8000
  image: app:django
  command: python manage.py runserver 0.0.0.0:8000
  depends_on:
   - db
 db:
  container_name: postgres_container
  env_file:
   - .env.prod
  image: postgres
  restart: always
  environment:
   POSTGRES_USER: ${PGUSER}
   POSTGRES_PASSWORD: ${PGPASSWORD}
   POSTGRES_DB: ${PGDATABASE}
  ports:
   - "${PGPORT}:${PGPORT}"
 pgadmin:
  container_name: pgadmin4_container
  image: dpage/pgadmin4
  restart: always
  environment:
   PGADMIN_DEFAULT_EMAIL: admin@admin.com
   PGADMIN_DEFAULT_PASSWORD: Password12345
  ports:
   - "5050:80"

.env.prod

PGHOST="127.0.0.1"
PGUSER="postgres"
PGPORT=5432
PGDATABASE="dev_db"
PGPASSWORD="postgres"

文件目录结构:
VSCode文件目录

问题原因

  1. 变量读取范围错误:docker-compose.yml中用${PGUSER}、${PGPORT}这类语法引用的变量,是从docker-compose命令运行时的主机环境读取的,而非db服务配置的env_file。env_file仅负责将变量注入容器内部环境,无法被docker-compose本身用来解析配置文件中的变量占位符。
  2. 环境变量格式错误:.env.prod中给变量值添加了引号,会导致变量值包含引号字符,引发解析异常。

解决方案

方案1:全局配置env_file让docker-compose读取变量

在docker-compose.yml顶部添加全局env_file配置,让docker-compose直接读取.env.prod中的变量来解析占位符:

version: "3.11"
# 全局配置,让docker-compose读取该文件的变量
env_file:
  - .env.prod
services:
 app:
  container_name: app_container
  build: .
  volumes:
   - .:/django
  ports:
   - 8000:8000
  image: app:django
  command: python manage.py runserver 0.0.0.0:8000
  depends_on:
   - db
 db:
  container_name: postgres_container
  env_file:
   - .env.prod
  image: postgres
  restart: always
  environment:
   POSTGRES_USER: ${PGUSER}
   POSTGRES_PASSWORD: ${PGPASSWORD}
   POSTGRES_DB: ${PGDATABASE}
  ports:
   - "${PGPORT}:${PGPORT}"
 pgadmin:
  container_name: pgadmin4_container
  image: dpage/pgadmin4
  restart: always
  environment:
   PGADMIN_DEFAULT_EMAIL: admin@admin.com
   PGADMIN_DEFAULT_PASSWORD: Password12345
  ports:
   - "5050:80"

方案2:简化端口配置(推荐)

PostgreSQL默认端口为5432,无需动态配置,直接写死端口映射,同时保留db服务的env_file给容器内部注入变量:

# 修改db服务的ports部分
db:
  container_name: postgres_container
  env_file:
   - .env.prod
  image: postgres
  restart: always
  environment:
   POSTGRES_USER: ${PGUSER}
   POSTGRES_PASSWORD: ${PGPASSWORD}
   POSTGRES_DB: ${PGDATABASE}
  ports:
   - "5432:5432"

通用修正:修复.env.prod格式

去掉变量值的引号,确保环境变量值正确:

PGHOST=127.0.0.1
PGUSER=postgres
PGPORT=5432
PGDATABASE=dev_db
PGPASSWORD=postgres

验证

修改完成后,重新执行docker-compose build和docker-compose up,即可正常启动容器。

内容的提问来源于stack exchange,提问作者code writer 3000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:03:11