You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile中含单引号的Docker命令执行失败问题求助

问题原因分析

出现这个差异的核心在于GNU Make与默认shell(Ubuntu 22.04.1中为dash)对单引号参数的解析交互异常,具体拆解如下:

  1. 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可正常执行命令。

  2. bash与dash的解析健壮性差异
    直接在bash中执行两条命令均正常,是因为bash对单引号参数的解析逻辑更健壮,能正确识别单引号内的完整模板字符串,不会出现参数拆分错误。

  3. 版本升级的影响
    Ubuntu 22.04升级到22.04.1后,dash的版本可能有所更新,引入了单引号内大括号解析的边缘bug;同时GNU Make 4.3的命令传递逻辑与新版本dash的交互放大了这个问题。

验证方法

在Makefile开头添加一行,强制使用bash执行命令:

SHELL := /bin/bash

此时执行make single应该能正常运行,验证是否是dash的解析问题。

内容的提问来源于stack exchange,提问作者Guillaume

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:05:22