Windows系统下Docker Compose的--env-file选项无法正常工作
问题
按照Docker官方指南使用--env-file选项从命令行导入环境变量,但始终无法成功。
我的compose.yaml文件内容如下:
services: test: image: ubuntu command: printenv environment: - my_var1=val1
同一目录下有一个.env文件,内容为:
my_var2=val2
执行命令docker compose --env-file .env up后,仅打印出my_var1=val1以及系统默认的PATH、HOSTNAME、HOME变量,.env文件中的my_var2并未被输出。
但如果在compose文件中配置env_file: .env,则my_var2=val2会被正常打印。
已在PowerShell、Cmd和GitBash中进行测试,结果一致。请问这是什么原因?是否是Docker的bug?
环境信息:
- Docker Compose version v2.10.2
- Docker version 20.10.17, build 100c701
- PSVersion 5.1.19041.2673
- GNU bash, version 5.1.16(1)-release (x86_64-pc-msys)
- Microsoft Windows 22H2
原因与解决方法
这不是Docker的bug,核心是你混淆了两个env-file相关功能的作用:
- 命令行参数
--env-file:它是给Docker Compose工具本身提供环境变量的,用于替换Compose文件中的变量占位符(比如${VAR_NAME}),不会直接把变量注入到容器里。你当前的compose.yaml里没有使用任何占位符,所以.env里的my_var2不会被传递给容器。 - Compose配置项
env_file:这个才是用来把指定文件中的环境变量直接加载到容器内部的配置,所以配置后my_var2能正常打印。
如果想通过命令行实现注入容器环境变量的需求,有两种可行方式:
- 方式一:修改
compose.yaml,用占位符引用变量,再通过--env-file传递值:
执行services: test: image: ubuntu command: printenv environment: - my_var1=val1 - my_var2=${my_var2}docker compose --env-file .env up,此时--env-file里的my_var2会替换占位符,传递给容器。 - 方式二:不修改Compose文件,直接用
run命令临时指定容器的环境变量文件:docker compose run --env-file .env test printenv
内容的提问来源于stack exchange,提问作者Melted Away
相关产品推荐
相关产品推荐

