2014-07-17 13 views
5

Próbuję dostać Jenkins uruchomić następujące polecenie w dokowanym na Jenkins slave:Jenkins nie czeka na polecenia Docker skończyć

docker run -i -v `pwd`:/opt/myapp -w /opt/myapp -t mydockerimage /bin/bash -c "./setup_dev_env.sh && make all" 

Problem jest to, że gdy ten od wewnątrz Jenkins Proces Docker'a jest tworzony, ale Jenkins nie czeka na nie i natychmiast zwraca sukces. Jeśli jednak zamienię polecenie Docker na nieskończoną pętlę, Jenkins będzie czekał zgodnie z oczekiwaniami.

Kiedy uruchomię to polecenie bezpośrednio z budowla slave, jako użytkownik Jenkins, system czeka na zakończenie polecenia (co właśnie chcę zrobić).

Próbowałem już wykonać docker attach, ale to również natychmiast zwraca. docker wait spowoduje, że Jenkins zaczeka na to, ale nie zobaczę żadnego wyjścia.

Może idę o to wszystko źle ...

  1. Jak mogę uzyskać Jenkins czekać na to polecenie, aby zakończyć?
  2. W jaki sposób można uzyskać, aby Jenkins wyświetlał dane wyjściowe polecenia działającego w kontenerze dokowania?
  3. Jak ustawić kod zakończenia komendy uruchamianej w Dockerze tak, aby Jenkins mógł określić, czy zakończyło się pomyślnie, czy nie?

Odpowiedz

8

Okazuje się, że problemem był -t w linii poleceń. Usunięcie -t spowodowało, że Jenkins czekał na doker, aby dokończyć to, co robił.

Miałem przeczucie, że tak było, ponieważ ttys czasami może być dziwne, a Jenkins prawdopodobnie używa innego typu tty (lub wcale) niż ja, gdy używam tego samego polecenia w wierszu poleceń powłoki.

W końcu, to polecenie działało:

docker run -i -v `pwd`:/opt/myapp -w /opt/myapp mydockerimage /bin/bash -c "./setup_dev_env.sh && make all" 
+0

Cieszę przyjąć każdą odpowiedź, która wyjaśnia, dlaczego tak się dzieje, czy istnieje lepszy sposób, aby sobie z tym poradzić. –

+2

t Przypisanie pseudo-tty, to jest inne z jenkins tty. więc jenkins natychmiast odniesie sukces. to wszystko – xds2000

Powiązane problemy