Moby: Como fazer o construtor RUN usar / bin / bash em vez de / bin / sh

Criado em 28 jul. 2014  ·  11Comentários  ·  Fonte: moby/moby

Estou criando um script de compilação do Dockerfile e gostaria de usar comandos bash. RUN usa / bin / sh por padrão. Existe alguma maneira de dizer ao RUN para usar / bin / bash em vez disso?

arebuilder kinquestion

Comentários muito úteis

@ORESoftware Veja a discussão acima e https://github.com/moby/moby/pull/22489 , que adicionou a instrução SHELL Dockerfile (Docker 1.12 e superior)

  • Se você quiser usar um shell diferente para um único RUN , use a notação do formulário Exec (JSON) - como está sendo discutido acima:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • Se você quiser alterar o shell padrão em sua imagem (e durante a compilação), use a instrução SHELL Dockerfile que foi implementada em https://github.com/moby/moby/pull/22489 :

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • Ou uma combinação das opções acima

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

Todos 11 comentários

Não, está codificado para "/ bin / sh -c"
É claro que alguém poderia vincular / bin / bash a / bin / sh em uma etapa de construção anterior.

Acabei alterando meu script Dockerfile para copiar um arquivo e usá-lo em vez de usar o redirecionamento que estava usando no bash.

@dwatrous você tentou RUN ["echo", "hello"] não será embrulhado por /bin/sh IIRC. Portanto, se você realmente deseja o bash, pode invocá-lo: RUN ["/bin/bash", "-c", "echo hello all in one string"] .
Deixe-nos saber se isso resolve o seu problema.

O bash pode ser usado manualmente usando-o nas instruções RUN .

Não há intenção ou plano de tornar possível alterá-lo para bash.

Vou marcar isso como um problema de documento porque podemos querer documentar isso. É a terceira ou quarta vez que essa pergunta surge.

Isso pode ser fechado agora devido a: https://github.com/docker/docker/pull/7489

então qual é a história deste aqui?

@ORESoftware Veja a discussão acima e https://github.com/moby/moby/pull/22489 , que adicionou a instrução SHELL Dockerfile (Docker 1.12 e superior)

  • Se você quiser usar um shell diferente para um único RUN , use a notação do formulário Exec (JSON) - como está sendo discutido acima:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • Se você quiser alterar o shell padrão em sua imagem (e durante a compilação), use a instrução SHELL Dockerfile que foi implementada em https://github.com/moby/moby/pull/22489 :

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • Ou uma combinação das opções acima

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

Eu sei que estou atrasado para a festa e sim esta não é a melhor solução, mas funcionou para o que eu precisava

No meu arquivo docker, depois de baixar e extrair o SDK, eu executo esses dois comandos

RUN cp / bin / bash / bin / sh
RUN echo "source ~ / google-cloud-sdk / path.bash.inc" >> ~ / .bashrc
Fonte RUN ~ / .bashrc

Depois disso, o comando gcloud está disponível durante a compilação e no tempo de execução

Para aqueles interessados ​​em reprodutibilidade OCI estrita, a chamada Dockerfile SHELL não parece estar na especificação OCIv1, por podman 1.4:

ETAPA 2: SHELL ["/ bin / bash", "-c"]
ERRO [0000] SHELL não é compatível com o formato de imagem OCI, [/ bin / bash -c] será ignorado. Deve usar o formato docker

Atualização: parece que thaJeztah está correto, alguma discussão sobre o suporte a esse recurso em buildah: https://github.com/containers/buildah/issues/507

Update2: BUILDAH_FORMAT=docker para o resgate

@qhaas não acha que isso tem a ver com as especificações OCI, apenas a implementação de buildah

Esta página foi útil?
0 / 5 - 0 avaliações