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

Docker Desktop(Windows)--env-file未读取指定.env_dev文件问题

Docker Compose 指定.env_dev却读取.env的问题解决

问题场景

我在Windows系统上运行Docker Desktop,相关配置与执行情况如下:

.env 文件内容

VERSION=local
ENV=local

.env_dev 文件内容

VERSION=dev
ENV=dev

docker-compose 配置片段

services:
  my_app:
    container_name: my_app_${ENV}
    image: "my_app:${VERSION}"
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
      target: my_app_${ENV}
      args:
        ENV: ${ENV:-local}
    environment:
      ENV:${ENV:-local}
      PYTHONPATH:${PYTHONPATH} 

Dockerfile 内容片段

FROM python:latest as base
ARG ENV
....
....
FROM base as my_app_dev
COPY "./.devcontainer/.env_$ENV" 

执行以下构建命令:

docker system prune -f
docker compose --env-file .env_dev  build --no-cache

出现错误,Docker仍尝试复制.env_local而非.env_dev:

=> ERROR [my_app my_app_dev 1/3] COPY ./.devcontainer/.env_local 

问题原因

  1. Windows PowerShell变量提前解析:PowerShell会优先解析${ENV}格式的变量,若系统环境中无对应变量,会将其替换为空字符串,导致Compose触发${ENV:-local}的默认值local。
  2. Compose默认.env加载机制:Compose默认会加载当前目录下的.env文件,若未明确禁用,即使指定了--env-file,也可能出现变量覆盖异常。
  3. 多阶段构建ARG传递缺失:Dockerfile中my_app_dev阶段未重新声明ARG ENV,ARG默认仅在声明的阶段生效,导致变量无法跨阶段传递。

解决方法

1. 避免PowerShell提前解析变量

在docker-compose.yml中,用单引号包裹所有包含${}变量的字段,阻止PowerShell提前解析:

services:
  my_app:
    container_name: 'my_app_${ENV}'
    image: 'my_app:${VERSION}'
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
      target: 'my_app_${ENV}'
      args:
        ENV: '${ENV:-local}'
    environment:
      ENV: '${ENV:-local}'
      PYTHONPATH: '${PYTHONPATH}' 

2. 切换到CMD执行构建命令

Windows命令提示符(CMD)不会解析${}格式的变量,直接在CMD中执行命令即可:

docker system prune -f
docker compose --env-file .env_dev build --no-cache

3. 修复Dockerfile的ARG传递问题

在my_app_dev阶段重新声明ARG ENV,确保变量能传递到该阶段,同时给COPY命令添加目标路径(避免语法错误):

FROM python:latest as base
ARG ENV
....
....
FROM base as my_app_dev
ARG ENV  # 重新声明ARG,继承base阶段的变量值
COPY "./.devcontainer/.env_$ENV" .  # 添加目标路径.

4. 禁用默认.env文件加载

若不需要加载默认的.env文件,可先指定空文件再加载.env_dev,确保仅使用指定的环境变量文件:

# Windows PowerShell下执行
docker compose --env-file NUL --env-file .env_dev build --no-cache

内容的提问来源于stack exchange,提问作者mike01010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:46:10