2014-07-17 24 views
5

Tôi đang cố gắng để có được Jenkins để chạy các lệnh sau đây trong vòng Docker trên một nô lệ Jenkins:Jenkins không chờ đợi lệnh Docker để kết thúc

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

Vấn đề là khi tôi chạy này từ bên trong Jenkins quá trình Docker được sinh ra, nhưng Jenkins không chờ đợi và trả về thành công ngay lập tức. Tuy nhiên, nếu tôi thay thế lệnh Docker bằng một vòng lặp vô hạn mà Jenkins sẽ đợi, như mong đợi.

Khi tôi chạy lệnh này trực tiếp từ người xây dựng, như người dùng Jenkins, hệ thống đợi lệnh kết thúc (đó là điều tôi muốn xảy ra).

Tôi đã thử thực hiện docker attach, nhưng điều đó cũng trả về ngay lập tức. docker wait sẽ khiến Jenkins phải đợi, nhưng tôi sẽ không thấy bất kỳ đầu ra nào.

Có lẽ tôi sẽ về điều này hoàn toàn sai ...

  1. Làm thế nào tôi có thể nhận Jenkins để chờ lệnh này để kết thúc?
  2. Làm thế nào tôi có thể nhận được Jenkins để hiển thị đầu ra của lệnh chạy trong vùng chứa docker?
  3. Làm cách nào để có thể lấy mã thoát của lệnh chạy trong Docker được đặt sao cho Jenkins có thể xác định xem nó có thành công hay không thành công?

Trả lời

8

Nó chỉ ra vấn đề là -t trong dòng lệnh. Loại bỏ -t khiến Jenkins phải đợi docker để hoàn thành công việc của nó.

Tôi có linh cảm trong trường hợp này vì đôi khi có thể lạ và Jenkins có thể sử dụng một loại tty khác (hoặc không hoàn toàn) so với khi tôi chạy lệnh tương tự tại dấu nhắc trình bao.

Cuối cùng, lệnh này làm việc:

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

Tôi rất sẵn lòng chấp nhận bất kỳ câu trả lời giải thích tại sao điều này xảy ra hoặc nếu có một cách tốt hơn để xử lý việc này. –

+2

t sẽ phân bổ một pseudo-tty, điều này là khác nhau với jenkins tty. vì vậy jenkins sẽ trở lại thành công ngay lập tức. đó là tất cả – xds2000

Các vấn đề liên quan