docker 如何使用带引号的新命令提交 docker

问题描述 投票:0回答:1

在制作 docker 的过程中,我必须将其命令从 /bin/sh 更改为

nginx -g "daemon off;"
(正是这样)。

我写道:

docker commit --change="EXPOSE 80" --change='CMD ["nginx", "-g", "\"daemon off;\""]' ${arr[0]} mine/nginx_final

在哪里

${arr[0]}
扩展到正确的docker容器。

然而,当我尝试运行这个 docker 时,它失败并显示错误:

nginx: [emerg] unexpected end of parameter, expecting ";" in command line

Docker inspect 也没有显示任何不好的东西:

        "Cmd": [
            "nginx",
            "-g",
            "\"daemon off;\""
        ],

预期,我希望

"\"daemon off;\""
扩展到“守护程序关闭;”

但是我很确定在

;
之后有一个
deamon off
标志。这个标志去哪儿了?我该如何调试呢? (并修复它)

docker nginx command-line-arguments
1个回答
4
投票

Nginx 无法处理包含引号的全局指令:

"daemon off;"

docker commit \
  --change='EXPOSE 80' \
  --change='CMD ["nginx", "-g", "daemon off;"]' \
  ${arr[0]} \
  mine/nginx_final

执行表格

CMD ["foo"]
称为 exec 形式。进程将通过
exec
而不是通过 shell 运行。数组中的每个元素都成为 exec 的参数。额外的
"
引号被传递给nginx:

CMD ["nginx", "-g", "\"daemon off;\""]
exec('nginx', '-g', '"daemon off;"')

使用 exec 形式已经通过了未改变的空间,所以你需要的是:

CMD ["nginx", "-g", "daemon off;"]
exec('nginx' '-g' 'daemon off;')

壳形

CMD foo
称为shell形式。带空格的全局指令参数需要在这里引用:

CMD nginx -g "daemon off;"
exec('sh', '-c', 'nginx -g "daemon off;"')
exec('nginx', '-g', 'daemon off;')

否则解释命令的 shell 将在空格上拆分参数并尝试使用 3 个参数执行

nginx

CMD nginx -g daemon off;
exec('sh', '-c', 'nginx -g daemon off;')
exec('nginx', '-g', 'daemon', 'off;')
© www.soinside.com 2019 - 2024. All rights reserved.