compose.yaml顶层name属性是否会设置COMPOSE_PROJECT_NAME用于插值
问题原因与解决方案
这个现象不是配置遗漏导致的,是旧版本Docker Compose的实现bug:
按照Compose规范要求,无论项目名是通过顶层name属性定义,还是通过其他自定义机制设置,都必须以COMPOSE_PROJECT_NAME的形式暴露,供配置插值和环境变量解析使用。但在V2.20版本之前的Docker Compose中,变量插值的执行时机早于顶层name字段的解析流程:程序会先扫描全量配置替换所有${}格式的变量,之后才会读取顶层name的值为COMPOSE_PROJECT_NAME赋值,这就导致替换container_name字段的变量时,COMPOSE_PROJECT_NAME还是空值,最终输出_database的错误结果。
你可以根据实际场景选择以下任意一种方案解决:
- 升级Docker Compose到V2.20及以上版本,官方已经在该版本修复了变量解析顺序的问题,升级后不需要修改任何配置,直接执行
docker compose config就能得到预期的插值结果 - 如果暂时无法升级版本,可以在执行compose命令前手动显式传入和顶层
name值一致的COMPOSE_PROJECT_NAME环境变量,例如执行COMPOSE_PROJECT_NAME=my-project docker compose config,即可得到正确的替换结果 - 也可以在
compose.yaml同级目录下创建.env文件,写入COMPOSE_PROJECT_NAME=my-project,旧版本Compose会优先读取.env文件中的变量完成插值,需要注意这里配置的值必须和顶层name字段的取值完全一致,避免出现项目名不匹配的异常。
内容的提问来源于stack exchange,提问作者Aaron Beaudoin
相关产品推荐
相关产品推荐

