在 docker 中使用 alpine 并尝试开始命名,但它只退出(输出为零)
这有效
CMD /usr/sbin/named -f -c /etc/bind/named.conf
然后在 docker 图像中表示为
"Cmd": [
"/bin/sh",
"-c",
"/usr/sbin/named -f -c /etc/bind/named.conf"
但是,这不起作用。
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
这是完整的 Dockerfile,我也将它用于 CI 测试
FROM alpine
RUN apk --no-cache add bind bind-tools bash
CMD /usr/sbin/named -f -c /etc/bind/named.conf
您混淆了命令的参数。
使用
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
,程序将其视为:但是使用 shell,因为 shell 会为您进行参数拆分,所以实际的命令是:
所以你可能应该像这样编写 Dockerfile:
CMD 命令有三种变体:
["executable", "param1", "param2"]
["param1", "param2"]
executable param1 param2
ENTRYPOINT
第二个只有在图像中指定时才有效。第一个和第三个之间的区别在于 exec 形式不运行 shell 而 shell 形式运行。换句话说
CMD /usr/sbin/named -f -c /etc/bind/named.conf
,在 Alpine 上实际运行/bin/sh -c "/usr/sbin/named -f -c /etc/bind/named.conf"
,因此等同于CMD ["/bin/sh", "-c", "/usr/sbin/named -f -c /etc/bind/named.conf"]
,这就是为什么两者都有效。至于
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
它将两个参数传递给named
:-f
和-c /etc/bind/named.conf
,当您显然想要传递三个参数时-f
:-c
和/etc/bind/named.conf
.你应该试试
CMD ["/usr/sbin/named", "-f", "-c", "/etc/bind/named.conf"]
。它可能会起作用,因为我认为这named
不需要外壳。另请参阅CMD 的 Dockerfile 参考