2015-11-16 16 views
5

Tôi đã chạy vùng chứa docker ubuntu chỉ với một tập lệnh bash bên trong. Tôi muốn bắt đầu ứng dụng của tôi bên trong container với Docker exec như thế:Tại sao docker exec đang giết quá trình nohup khi thoát?

docker exec -it 0b3fc9dd35f2 ./main.sh 

Bên trong kịch bản chính tôi muốn chạy một ứng dụng khác với nohup vì đây là một ứng dụng đang chạy dài:

#!/bin/bash 
nohup ./java.sh & 
#with this strange sleep the script is working 
#sleep 1 
echo `date` finish main >> /status.log 

Các java .sh script là như sau (để đơn giản nó là một kịch bản giả):

#!/bin/bash 
sleep 10 
echo `date` finish java >> /status.log 

Vấn đề là java.sh bị giết ngay sau khi docker exec trả về. Câu hỏi đặt ra là tại sao?

Giải pháp duy nhất tôi phát hiện ra là thêm một số giả sleep 1 vào tập lệnh đầu tiên sau khi nohup được bắt đầu. Hơn quá trình thứ hai đang chạy tốt. Bạn có bất kỳ ý tưởng tại sao nó như thế?

[EDIT]

giải pháp thứ hai là thêm một số echo hoặc trap lệnh để java.sh kịch bản ngay trước khi ngủ. Hơn nó hoạt động tốt. Thật không may tôi không thể sử dụng workaround này thay vì kịch bản này tôi có quá trình java.

+0

Bạn không bắt đầu một container với 'Docker exec', nhưng với một 'docker run' và bạn nên xem xét kỹ các chỉ thị' CMD' và 'ENTRYPOINT' trong một Do ckerfile – user2915097

+0

Tôi đã chạy vùng chứa với quy trình khác. Với docker exec tôi muốn bắt đầu một thứ hai. Đây là kịch bản tích hợp tiếp tục, do đó chúng tôi muốn có nhiều quy trình hơn trong một vùng chứa. –

Trả lời

5

Đây không phải là câu trả lời, nhưng tôi vẫn không có danh tiếng cần thiết để nhận xét.

Tôi không biết tại sao nohup không hoạt động. Nhưng tôi đã giải quyết một cách hữu ích, sử dụng ý tưởng của bạn:

docker exec -ti running_container bash -c 'nohup ./main.sh &> output & sleep 1' 
+0

cảm ơn, điều này làm việc cho tôi. – mainframer

2

Tôi biết đây là phản hồi trễ nhưng tôi sẽ thêm nó ở đây vì lý do tài liệu.

Khi sử dụng nohup trên bash và chạy nó với 'exec' trên một container Docker, bạn nên sử dụng

$ docker exec -d 0b3fc9dd35f2 /bin/bash -c "./main.sh"

Các tùy chọn -d có nghĩa là:

-d, - tách chế độ Riêng biệt: chạy lệnh trong nền

để biết thêm thông tin về docker exec, xem: https://docs.docker.com/engine/reference/commandline/exec/

Điều này cần thực hiện thủ thuật.

1

Được rồi, chúng ta hãy tham gia hai câu trả lời ở trên: D

Trước rcmgleite nói chính xác phải: sử dụng

-d

tùy chọn để chạy quá trình làm nền 'tách'.

Và thứ hai (quan trọng nhất!) nếu bạn chạy tách ra quy trình, bạn không cần thiết nohup!

deploy_app.sh

#!/bin/bash 
cd /opt/git/app 
git pull 
python3 setup.py install 
python3 -u webui.py >> nohup.out 

Execute này bên trong một container

docker exec -itd container_name bash -c "/opt/scripts/deploy_app.sh" 

Kiểm tra nó

$ docker attach container_name 
$ ps aux 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root   1 0.0 0.0 11768 1940 pts/0 Ss Aug31 0:00 /bin/bash 
root  887 0.4 0.0 11632 1396 pts/1 Ss+ 02:47 0:00 /bin/bash /opt/scripts/deploy_app 
root  932 31.6 0.4 235288 32332 pts/1 Sl+ 02:47 0:00 python3 -u webui.py 
Các vấn đề liên quan