在制作 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
标志。这个标志去哪儿了?我该如何调试呢? (并修复它)
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;')