Makefile中含单引号的Docker命令执行失败问题求助
问题原因分析
出现这个差异的核心在于GNU Make与默认shell(Ubuntu 22.04.1中为dash)对单引号参数的解析交互异常,具体拆解如下:
Make与shell的命令传递逻辑差异
GNU Make默认使用/bin/sh执行目标命令,而Ubuntu 22.04.1中/bin/sh是dash的符号链接。当命令用单引号包裹{{ .IPAM }}时,dash对参数的解析出现边缘场景异常:它没有正确识别单引号内的完整模板字符串,导致传递给docker的参数结构不符合预期,进而触发权限校验失败(表现为make: docker: Permission denied)。而双引号包裹时,Make会先尝试展开字符串内的Make变量(此处无有效变量,内容保持原样),再传递给dash。此时dash能正确解析完整参数,docker可正常执行命令。
bash与dash的解析健壮性差异
直接在bash中执行两条命令均正常,是因为bash对单引号参数的解析逻辑更健壮,能正确识别单引号内的完整模板字符串,不会出现参数拆分错误。版本升级的影响
Ubuntu 22.04升级到22.04.1后,dash的版本可能有所更新,引入了单引号内大括号解析的边缘bug;同时GNU Make 4.3的命令传递逻辑与新版本dash的交互放大了这个问题。
验证方法
在Makefile开头添加一行,强制使用bash执行命令:
SHELL := /bin/bash
此时执行make single应该能正常运行,验证是否是dash的解析问题。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

