Docker运行golang alpine镜像报unknown operand错误排查
问题根因
这个错误和alpine基础镜像没有任何关系,完全是Dockerfile中CMD指令的写法错误导致的:
- 你当前写的是
CMD的exec(JSON数组)格式,这种格式要求数组内所有元素都必须是双引号包裹的合法JSON字符串,但你写的$PROJECT没有加双引号,Docker无法将这行解析为合法JSON,最终直接把整行[ "echo", $PROJECT ]作为命令字符串交给sh -c执行。 - 容器启动时,shell会把命令开头的
[识别为内置的test命令(即shell条件判断的底层命令),结合你传入的环境变量PROJECT=37473816,shell拆分后的执行逻辑等价于运行test "echo," 37473816 "]"。test命令会将参数列表的第二个值识别为条件操作符,而37473816根本不是合法的操作符,因此抛出sh: 37473816: unknown operand错误。 - 你在Docker环境外执行逻辑正常,是因为手动敲命令时是直接在shell中运行
echo $PROJECT,不会出现把[误识别为命令的情况。
注意:就算你给
$PROJECT补上双引号让JSON语法合法,exec格式默认不会启动shell解析环境变量,最终会直接输出字面量$PROJECT,依然不符合预期。
修复方案
两种写法选一个即可:
- 直接使用shell格式的CMD,不需要写JSON数组,Docker会自动调用shell解析运行时的环境变量:
CMD echo $PROJECT
- 如果要保留exec格式(适合需要让业务进程直接作为1号进程接收系统信号的场景),需要显式调用shell,所有数组元素都用双引号包裹,把变量放在shell要执行的命令字符串内:
CMD [ "sh", "-c", "echo $PROJECT" ]
修改后重新构建镜像,再运行容器就能正常输出传入的PROJECT值。
内容的提问来源于stack exchange,提问作者DAG
相关产品推荐
相关产品推荐

