Docker Compose自定义.env文件构建参数不生效问题及解决咨询
请参考以下使用自定义.env文件的docker-compose示例文件:
version: '3' services: service_example: build: dockerfile: Dockerfile context: . args: AAA: ${AAA} command: python3 src/service/run.py env_file: - custom_env.env
custom_env.env文件内容:
AAA=qqq
运行docker-compose config命令后,输出如下:
WARNING: The AAA variable is not set. Defaulting to a blank string. services: service_example: build: args: AAA: '' <----------------------------- ?????? context: /Users/examples dockerfile: Dockerfile command: python3 src/service/run.py environment: AAA: qqq version: '3'
为什么build部分中的AAA变量没有被设置?
如何正确将其设置为自定义文件中提供的值(AAA=qqq)?
我还发现,如果把环境变量文件名改成默认的.env(执行mv custom_env.env .env),并从docker-compose.yml中移除env_file配置段,一切就能正常运行:
services: service_example: build: args: AAA: qqq context: /Users/examples dockerfile: Dockerfile command: python3 src/service/run.py version: '3'
问题解答
原因分析
Docker Compose处理build.args中的变量时,只会读取默认的.env文件或系统环境变量,不会读取env_file里的内容。env_file的作用是给容器运行时注入环境变量,和解析docker-compose.yml本身的变量替换是两个独立的阶段。
所以build.args里的${AAA},Compose会优先从系统环境变量查找,找不到就去默认.env文件找,最后才会用空字符串填充,这就是你看到AAA: ''的原因。而容器环境里的AAA: qqq是env_file生效的结果,两者作用阶段完全不同。
解决方法
有两种可行方式:
运行时指定自定义env文件
无需修改现有文件,执行命令时通过--env-file参数指定自定义环境变量文件,Compose解析build.args时就能读取到里面的变量:docker-compose --env-file custom_env.env config这样
build.args里的AAA会被正确替换为qqq。将自定义env文件设为默认
.env
即你已经发现的方法:执行mv custom_env.env .env,然后移除docker-compose.yml里的env_file配置段。此时Compose会自动加载.env文件,解析build.args时就能获取到AAA的值。
如果需要同时给容器运行时注入变量,也可以保留env_file配置,只要默认.env里有对应变量,build.args和容器环境变量都会正常生效。
内容的提问来源于stack exchange,提问作者Ivan Vinogradov

