Eu estou tentando obter Jenkins para executar o seguinte comando dentro do Docker em um escravo Jenkins:
docker run -i -v `pwd`:/opt/myapp -w /opt/myapp -t mydockerimage /bin/bash -c "./setup_dev_env.sh && make all"
O problema é que quando eu corro de dentro de Jenkins o processo do Docker é gerado, mas o Jenkins não espera por ele e retorna o sucesso imediatamente. Se, no entanto, eu substituir o comando do Docker por um loop infinito, o Jenkins aguardará, como esperado.
Quando executo este comando diretamente do escravo de construção, como o usuário Jenkins, o sistema aguarda que o comando seja concluído (que é o que eu quero que aconteça).
Eu tentei fazer um docker attach
, mas isso também retorna imediatamente. docker wait
fará com que Jenkins espere por isso, mas eu não verei nada da saída.
Talvez eu esteja fazendo tudo errado ...
- Como posso fazer com que Jenkins espere que esse comando termine?
- Como posso fazer com que Jenkins exiba a saída do comando em execução no contêiner docker?
- Como posso obter o código de saída do comando executado no Docker para que seja configurado de forma que o Jenkins possa determinar se foi bem-sucedido ou não?
Respostas:
8 para resposta № 1Acontece que o problema era o -t
na linha de comando. Removendo -t
fez com que Jenkins esperasse que o docker terminasse o que estava fazendo.
Eu tive um palpite, este foi o caso porque ttys podeàs vezes ser estranho e Jenkins provavelmente está usando um tipo diferente de tty (ou não) do que quando estou executando o mesmo comando no prompt do shell.
No final, esse comando funcionou:
docker run -i -v `pwd`:/opt/myapp -w /opt/myapp mydockerimage /bin/bash -c "./setup_dev_env.sh && make all"