Dockerfile exec 形式:无需 shell 引号直接传入 curl --noproxy *
在 exec 形式中,每个 JSON 字符串就是一个参数。多余的 shell 引号可能改变 curl 为 --noproxy 收到的值。
在 Dockerfile 的 exec 形式中,JSON 数组本身就是参数列表:
CMD ["curl", "--noproxy", "*", "https://example.com/"]
这里 curl 把 --noproxy 和 * 作为两个独立参数接收。星号不会被展开成文件名,因为没有任何命令 shell 解释这种形式。
不要把选项和值放进同一个 JSON 字符串。也不要仅仅因为终端示例为了 shell 保护而使用了单引号,就往字符串里添加字面单引号。那些引号字符可能成为传给程序的值的一部分。
shell 形式有另一条边界:它确实会经过 shell,因此引号和展开规则在那里起作用。从 exec 形式命令中显式启动一个 shell,就会把那条边界重新加回来。
curl 中 --noproxy * 的含义是为所有主机绕过代理。这是路由选择,不是通用的参数格式测试。只有在直连路径就是预期策略时才使用它。如果你需要范围更窄的绕过,请在同样的每个元素一个参数结构中提供匹配的值。