使用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"
文件目录结构:
问题原因
- 变量读取范围错误:docker-compose.yml中用
${PGUSER}、${PGPORT}这类语法引用的变量,是从docker-compose命令运行时的主机环境读取的,而非db服务配置的env_file。env_file仅负责将变量注入容器内部环境,无法被docker-compose本身用来解析配置文件中的变量占位符。 - 环境变量格式错误:
.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
相关产品推荐
相关产品推荐

