如何在Makefile中导出主机名并在docker-compose文件中使用
问题分析
你当前的代码存在3个核心问题:
- Makefile 默认每个目标下的每行命令在独立的shell进程中执行,第一行
export MY_HOST=hostname -i``导出的环境变量仅在该行对应的shell进程生效,后续的echo、docker启动命令属于全新的shell进程,无法拿到该变量。 - Makefile 中
${MY_HOST}的写法会被Make优先识别为Make自身的变量展开,而非留给shell读取环境变量,即使进程共享,也会被提前展开为空值。 - 启动命令拼写错误:
docker -f test.yml up -d是非法命令,指定compose配置文件启动容器的命令为docker-compose -f test.yml up -d或新版Docker的docker compose -f test.yml up -d。
修复方案
方案1:合并命令行到同一shell进程,同时转义变量符号
将所有关联命令合并为一行执行,确保共享同一个shell的环境变量,同时用$$转义$符号,避免Make提前展开变量:
start: export MY_HOST=`hostname -i` && echo $$MY_HOST && docker-compose -f test.yml up -d
注意:Makefile中目标下的命令行必须使用Tab缩进,不能用空格代替。
方案2:提前在Make层级定义变量(更易维护)
直接在Makefile全局区域提前计算主机IP,赋值为Make变量,后续所有命令直接调用该变量即可,无需处理shell环境变量导出问题:
# 提前计算主机IP赋值给Make变量 MY_HOST := $(shell hostname -i) start: echo ${MY_HOST} docker-compose -f test.yml up -d
两种方案都可以正常将主机IP传入docker-compose配置,你写的docker-compose.yml中MY_HOST=${MY_HOST}的写法无需修改。
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

