为何Makefile中执行docker命令返回空,控制台执行却正常?
Makefile中执行docker inspect获取镜像ID返回空的解决方案
问题原因
你遇到的核心问题是Makefile的语法和Shell语法冲突:
Makefile里的$(...)是Make的变量引用语法,不是Shell的命令替换。你原写法里的$(docker container inspect...)会被Make当作一个不存在的变量名解析,展开后是空字符串,最终执行的就只剩echo命令,所以没有输出结果。
修复方案
把Shell的命令替换语法$(...)改成$$(...)——因为Make会把$$转义为单个$,这样Shell就能正确识别这是命令替换操作。同时,引用Make定义的CONTAINER变量时,用$(CONTAINER)更清晰。
修改后的Makefile示例:
CONTAINER=name_1 cmd: @echo $$(docker container inspect --format='{{.Image}}' $(CONTAINER))
(加@可以避免输出echo命令本身,只显示最终的镜像ID结果)
额外优化建议
如果你的目标是清理docker-compose up --build产生的悬空镜像,其实不需要手动获取容器镜像ID,Docker有专门的命令自动清理所有悬空镜像:
build-and-clean: docker-compose up --build -d docker image prune -f
这个操作更简单可靠,适合直接集成到你的快捷操作里。
内容的提问来源于stack exchange,提问作者Archirk
相关产品推荐
相关产品推荐

