Trabalhando com alpine no docker e tentando iniciar o named, mas só sai (com saída zero)
Isso funciona
CMD /usr/sbin/named -f -c /etc/bind/named.conf
e é então representado na imagem docker como
"Cmd": [
"/bin/sh",
"-c",
"/usr/sbin/named -f -c /etc/bind/named.conf"
Entretanto, isso não funciona.
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
Aqui está o Dockerfile completo, eu também uso para CI Test
FROM alpine
RUN apk --no-cache add bind bind-tools bash
CMD /usr/sbin/named -f -c /etc/bind/named.conf
Você está confundindo argumentos para o comando.
Com
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
, o programa o vê como:No entanto, usando um shell, porque o shell faz a divisão de parâmetros para você, o comando real é:
Então você provavelmente deveria escrever o Dockerfile assim:
O comando CMD tem três variantes:
["executable", "param1", "param2"]
["param1", "param2"]
executable param1 param2
A segunda só é válida se
ENTRYPOINT
estiver especificada na imagem. A diferença entre o primeiro e o terceiro é que o formulário exec não roda shell e o formulário shell sim.Em outras palavras
CMD /usr/sbin/named -f -c /etc/bind/named.conf
, no Alpine realmente funciona/bin/sh -c "/usr/sbin/named -f -c /etc/bind/named.conf"
e, portanto, é equivalente aCMD ["/bin/sh", "-c", "/usr/sbin/named -f -c /etc/bind/named.conf"]
, razão pela qual ambos funcionam.Quanto a
CMD ["/usr/sbin/named", "-f", "-c /etc/bind/named.conf"]
ele passa DOIS argumentos paranamed
:-f
e-c /etc/bind/named.conf
, quando claramente você deseja passar TRÊS argumentos:-f
,-c
e/etc/bind/named.conf
.Você deveria tentar
CMD ["/usr/sbin/named", "-f", "-c", "/etc/bind/named.conf"]
. Provavelmente funcionará, pois não acho que issonamed
exija o shell.Consulte também referência do Dockerfile para CMD