Eu sou novo no mundo dos estivadores. Eu tenho que chamar um script de shell que leva argumentos de linha de comando através de um contêiner de janela de encaixe. Ex: Meu script shell se parece com:
#!bin/bash
echo $1
O Dockerfile fica assim:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Não sei como transmitir os argumentos enquanto estiver executando o contêiner
bash
shell
docker
command-line-arguments
Akash Mehta
fonte
fonte
docker run -ti test /file.sh abc
. Eu sinto que o script não será executado porque deveria serdocker run -ti test sh /file.sh abc
. sh ou / bin / sh executará corretamente.com este script em
file.sh
e isto
Dockerfile
você deve ser capaz de:
fonte
ENTRYPOINT ./file.sh
chmod +x file.sh
definir o sinalizador executável.["/file.sh"]
e/file.sh
ou mesmo[/file.sh]
Com o Docker, a maneira correta de passar esse tipo de informação é através de variáveis de ambiente.
Portanto, com o mesmo Dockerfile, altere o script para
Após a construção, use o seguinte comando do docker:
fonte
Existem algumas coisas interagindo aqui:
docker run your_image arg1 arg2
substituirá o valor deCMD
comarg1 arg2
. Essa é uma substituição completa do CMD, não acrescentando mais valores a ele. É por isso que você costumadocker run some_image /bin/bash
executar um shell bash no contêiner.Quando você tem um valor ENTRYPOINT e um valor CMD definidos, a janela de encaixe inicia o contêiner concatenando os dois e executando esse comando concatenado. Portanto, se você definir seu ponto de entrada
file.sh
, agora poderá executar o contêiner com argumentos adicionais que serão passados como argumentos parafile.sh
.Pontos de entrada e comandos na janela de encaixe possuem duas sintaxes, uma sintaxe de cadeia que iniciará um shell e uma sintaxe json que executará um exec. O shell é útil para lidar com coisas como redirecionamento de E / S, encadear vários comandos juntos (com coisas como
&&
), substituição de variáveis etc. No entanto, esse shell atrapalha a manipulação do sinal (se você já viu um atraso de 10 segundos para parar um contêiner, isso geralmente é a causa) e concatenar um ponto de entrada e um comando juntos. Se você definir seu ponto de entrada como uma sequência, ele será executado/bin/sh -c "file.sh"
, o que por si só é bom. Mas se você tiver um comando definido como uma sequência também, verá algo como/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
o comando sendo lançado dentro do seu contêiner, não tão bom. Veja a tabela aqui para mais informações sobre como essas duas opções interagemA
-c
opção shell usa apenas um único argumento. Tudo depois disso seria passado como$1
,$2
etc, para esse único argumento, mas não para um script de shell incorporado, a menos que você passasse explicitamente os argumentos. Ou seja/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
, funcionaria, mas/bin/sh -c "file.sh" "arg1" "arg2"
nãofile.sh
seria desde então chamado sem argumentos.Juntando tudo isso, o design comum é:
E você executa isso com:
Há um pouco mais de detalhes sobre isso em:
fonte
["bash", "--login", "-c"]
para obter a origem do / etc / profile na imagem, mas depois fiquei perguntando por que nenhum argumento seria passado para um script de shell passado para a execução do docker ... Sua resposta esclareceu isso, obrigado !O que tenho é um arquivo de script que realmente executa as coisas. Esse arquivo de script pode ser relativamente complicado. Vamos chamá-lo de "run_container". Este script usa argumentos da linha de comando:
Um simples run_container pode ser:
O que eu quero fazer é que, depois de "encaixar" isso, eu gostaria de inicializar este contêiner com os parâmetros na linha de comando do docker, como este:
e faça com que o script run_container seja executado com p1 p2 p3 como parâmetros.
Esta é a minha solução:
Dockerfile:
fonte
ENTRYPOINT
matriz por"/run_container \"$@\""
argumentos de média contendo espaços é tratado corretamente (por exemplodocker run image_name foo 'bar baz' quux
).Se você deseja executá-lo em @build time:
se você quiser executá-lo em @run time:
Em seguida, no shell do host
fonte
ENTRYPOINT
é uma boa resposta para o OP que, na minha opinião, queria tempo de execução, mas se você realmente deseja criar variáveis de tempo, essa resposta está quebrada. UseARG
edocker build --build-arg
docs.docker.com/engine/reference/builder/#argOutra opção...
Para fazer isso funcionar
em dockerfile
no entrypoint.sh
fonte