Um shell só é necessário para executar scripts de shell ou fornecer uma sessão de shell interativa. Um contêiner executando um binário não precisa de nenhum deles; ele executa o binário fornecido como ponto de entrada (se especificado no execformulário) sem usar um shell.
Para poder construir e executar um contêiner sem um shell, você precisa garantir que todas as diretivas de contêiner que executam comandos ( ENTRYPOINTmencionadas acima, RUNetc.) usem o execformulário, ou seja ,
ENTRYPOINT ["executable", "arg1", "arg2"]
em vez da forma de concha
ENTRYPOINT executable arg1 arg2
O último depende do shell e falha se /bin/sh(ou o shell configurado com SHELL) não estiver disponível.
O execformulário tem uma série de vantagens, além de não precisar de um shell: notavelmente, ele simplifica o tratamento de sinais e evita uma série de problemas de análise de shell.
Um shell só é necessário para executar scripts de shell ou fornecer uma sessão de shell interativa. Um contêiner executando um binário não precisa de nenhum deles; ele executa o binário fornecido como ponto de entrada (se especificado no
exec
formulário) sem usar um shell.Para poder construir e executar um contêiner sem um shell, você precisa garantir que todas as diretivas de contêiner que executam comandos (
ENTRYPOINT
mencionadas acima,RUN
etc.) usem oexec
formulário, ou seja ,em vez da forma de concha
O último depende do shell e falha se
/bin/sh
(ou o shell configurado comSHELL
) não estiver disponível.O
exec
formulário tem uma série de vantagens, além de não precisar de um shell: notavelmente, ele simplifica o tratamento de sinais e evita uma série de problemas de análise de shell.