2015-07-03 15 views
11

के माध्यम से डॉकर कंटेनर को बंद करना मैं पर्यवेक्षक द्वारा supervisorctl stop all के माध्यम से लॉन्च किए गए डॉकर कंटेनर को बंद करने में असमर्थ हूं। यहां तक ​​कि supervisorctl status के माध्यम से कंटेनर नीचे हैं, docker ps और ps इंगित करते हैं कि वे वास्तव में अभी भी चल रहे हैं।पर्यवेक्षक

supervisorctl stop <name> के लिए कार्रवाई पर पर्यवेक्षक दस्तावेज़ीकरण से परामर्श से पता चलता है कि SIGTERM प्रक्रियाओं को SIGKILL के बाद भेजा जाता है यदि कुछ अनुग्रह अवधि के बाद भी चल रहा है। मैं इस मैन्युअल रूप से करने की कोशिश की और पाया कि

  • SIGTERM एक docker run प्रक्रिया के लिए भेजा कुछ भी
  • SIGKILL नहीं करता है प्रक्रिया को मारने करता है, लेकिन वास्तव में डोकर अपडेट नहीं होता। docker ps से पता चलता इस कंटेनर अभी भी चल रहा है
  • पर्यवेक्षक का SIGKILL कंटेनर

सवालों बंद नहीं करता है: मैं कैसे ठीक से पर्यवेक्षक द्वारा एक डोकर कंटेनर को बंद कर सकता हूँ?

शुरू स्थिति: foo-1 और bar-1 (मैं में GCE कंटेनर छोड़ दिया है, मामले में वे एक फर्क) द्वारा चलाए जा रहे


यहाँ मेरी प्रयोगों पर्यवेक्षक अनुकरण का परिणाम है। ps aux और docker ps सिंक में हैं।

[email protected]:~$ sudo docker ps 
CONTAINER ID  IMAGE     COMMAND    CREATED    STATUS    PORTS     NAMES 
5ba70bf8937f  me/app:foo    "/bin/sh -c 'supervi 5 minutes ago  Up 5 minutes         foo-1 
e1a684bcfceb  me/app:bar    "/bin/sh -c 'supervi 5 minutes ago  Up 5 minutes         bar-1 
fce5db0517df  google/cadvisor:0.8.0 "/usr/bin/cadvisor" 35 minutes ago  Up 35 minutes        bbbb 
db677eed47ef  kubernetes/pause:go  "/pause"    35 minutes ago  Up 35 minutes  0.0.0.0:4194->8080/tcp aaaa 

[email protected]:~$ ps aux | grep "docker run" 
root  23358 0.0 0.1 124092 11856 pts/0 Sl 02:05 0:00 docker run --rm --name foo-1 ... -i me/app:foo 
root  23365 0.0 0.1 124092 11928 pts/0 Sl 02:05 0:00 docker run --rm --name bar-1 ... -i me/app:bar 

अनुकरण supervisorctl stop foo-1 प्रक्रिया को SIGTERM भेज कर। परिणाम: प्रक्रिया अभी भी सक्रिय है।

[email protected]:~$ sudo kill -SIGTERM 23358 

... <waiting> ... 

[email protected]:~$ ps aux | grep "docker run" 
root  23358 0.0 0.1 124092 11856 pts/0 Sl 02:05 0:00 docker run --rm --name foo-1 ... -i me/app:foo 
root  23365 0.0 0.1 124092 11928 pts/0 Sl 02:05 0:00 docker run --rm --name bar-1 ... -i me/app:bar 

[email protected]:~$ sudo docker ps 
CONTAINER ID  IMAGE     COMMAND    CREATED    STATUS    PORTS     NAMES 
5ba70bf8937f  me/app:foo    "/bin/sh -c 'supervi 6 minutes ago  Up 6 minutes         foo-1 
e1a684bcfceb  me/app:bar    "/bin/sh -c 'supervi 6 minutes ago  Up 6 minutes         bar-1 
fce5db0517df  google/cadvisor:0.8.0 "/usr/bin/cadvisor" 36 minutes ago  Up 36 minutes        bbbb 
db677eed47ef  kubernetes/pause:go  "/pause"    36 minutes ago  Up 36 minutes  0.0.0.0:4194->8080/tcp aaaa 

अगला बात पर्यवेक्षक करना होगा SIGKILL जारी करने के है। परिणाम: प्रक्रिया मारे गए (ps aux), लेकिन अभी भी चलने वाले डॉकर प्रक्रिया (docker ps) के रूप में दिखाया जा रहा है।

[email protected]:~$ sudo kill -SIGKILL 23358 
[email protected]:~$ ps aux | grep "docker run" 
root  23365 0.0 0.1 124092 11928 pts/0 Sl 02:05 0:00 docker run --rm --name bar-1 ... -i me/app:bar 

[email protected]:~$ sudo docker ps 
CONTAINER ID  IMAGE     COMMAND    CREATED    STATUS    PORTS     NAMES 
5ba70bf8937f  me/app:foo    "/bin/sh -c 'supervi 19 minutes ago  Up 19 minutes        foo-1 
e1a684bcfceb  me/app:bar    "/bin/sh -c 'supervi 19 minutes ago  Up 19 minutes        bar-1 
fce5db0517df  google/cadvisor:0.8.0 "/usr/bin/cadvisor" 49 minutes ago  Up 49 minutes        bbbb 
db677eed47ef  kubernetes/pause:go  "/pause"    49 minutes ago  Up 49 minutes  0.0.0.0:4194->8080/tcp aaaa 

पर्यवेक्षक ऊपर प्रयोग के दौरान बंद कर दिया गया (हस्तक्षेप करने के लिए अपनी स्वत: प्रारंभ व्यवहार से बचने के लिए)। प्रक्रिया में SIGKILL को स्पष्ट रूप से भेजने के परिणाम पर्यवेक्षक द्वारा प्राप्त नहीं किए जा सकते थे; प्रक्रिया अभी भी जिंदा थी (भले ही पर्यवेक्षक अन्यथा राज्य लॉग करता है)। docker stop <container_id> हालांकि कंटेनर को रोक दिया था।

अद्यतन

डोकर कंटेनर के अंदर भी एक supervisord प्रक्रिया चल रहे हों जो कुछ प्रक्रियाओं का प्रबंधन करता है। शायद समस्या यह है कि संकेत प्रचारित नहीं कर रहे हैं और इस तरह इसे बंद नहीं होगा ...

अद्यतन 2

मैं इस समस्या को संकुचित होता है। मैं supervisord शुरू करने के बजाय Dockerfile से सीधे कंटेनर प्रक्रिया शुरू करने में सक्षम था और इससे कोई फर्क पड़ता है। मैं पर्यवेक्षक के माध्यम से इस कंटेनर को नियंत्रित करने में सक्षम हूं (डॉकर कंटेनर के बाहर एक जो कंटेनरों को नियंत्रित करता है)।

अद्यतन 3

stopasgroup=true स्थापना के रूप में सुझाव here मेरे लिए कुछ भी नहीं बदलता है।

अद्यतन 4

मैं समस्याओं में से एक को हल करने में सक्षम था: supervisorctl नहीं प्रक्रिया बंद करने में सक्षम किया जा रहा है। समस्या यह थी कि मैं पर्यवेक्षक कॉन्फ़िगरेशन फ़ाइल में command=sudo docker run... के साथ डॉकर कंटेनर लॉन्च कर रहा था जिसने sudo docker run... और docker run... प्रक्रिया बनाई थी। supervisorctl stop... ने वास्तविक डॉकर प्रक्रिया अभी भी चल रही थी, जबकि sudo docker run... प्रक्रिया को समाप्त कर दिया था। जब मैं sudo कमांड को छोड़ देता हूं, प्रति पर्यवेक्षक कार्यक्रम केवल 1 प्रक्रिया शुरू हो जाती है और supervisorctl stop प्रक्रिया को समाप्त कर देता है।

एक समस्या यह बनी हुई है कि docker ps दिखाता है कि कंटेनर अभी भी चल रहा है जबकि ps aux नहीं है। विचित्र रूप से पर्याप्त कंटेनर अभी भी सक्रिय होने लगते हैं क्योंकि वे अनुरोधों का जवाब देते हैं। प्रक्रिया सूची पर एक त्वरित रूप से पुष्टि करता है कि डॉकर कंटेनर द्वारा उत्पन्न सभी प्रक्रियाएं अभी भी सक्रिय हैं, फिर भी docker run... प्रक्रिया प्रक्रिया सूची से अनुपलब्ध है।

अद्यतन 5

docker run प्रक्रिया को SIGTERM, SIGHUP या SIGQUIT भेजा जा रहा है की प्रक्रिया के लिए कुछ भी करने को नहीं लगता है। केवल SIGKILL डॉकर प्रक्रिया को ठीक से समाप्त करता है। पर्यवेक्षक को ठीक से अद्यतन किया जाता है, लेकिन docker ps अभी भी डॉकर प्रक्रिया चल रहा है।

उत्तर

7

मुझे लगता है कि मुझे समस्या मिली है। मुझे इसका एहसास नहीं हुआ, लेकिन जब एक डॉकर कंटेनर निकाल दिया जाता है तो प्रोग्राम शुरू करने के कई तरीके हैं।

जाहिर CMD myexec param1 param2 एक खोल जो बारी में शुरू होता है myexec (वास्तव में इन दोनों प्रक्रियाओं दिखाई कंटेनर में /bin/sh -c myexec... साथ पीआईडी ​​1. पर हैं एक बेहतर तरीका (सीधे कार्यक्रम शुरू करने के लिए मेरे मामले supervisord में) है शुरू होता है।

दूसरी ओर, CMD ["/usr/bin/python", "/usr/local/bin/supervisord", "-c", "/root/supervisord.conf", "--nodaemon"] ठीक काम किया। अब मैं पर्यवेक्षक के माध्यम से डॉकर कंटेनर को शुरू और बंद करने में सक्षम हूं।

Here's डोकर डॉक्स में प्रासंगिक अनुभाग:

सीएमडी अनुदेश तीन रूप हैं:

CMD ["executable","param1","param2"]

CMD ["param1","param2"] (के रूप में (कार्यकारी रूप है, यह पसंद किया रूप है) ENTRYPOINT के लिए डिफ़ॉल्ट पैरामीटर)

CMD command param1 param2 (खोल एफ ORM)

अद्यतन

उदाहरण पर्यवेक्षक फ़ाइल (डोकर अंदर कंटेनर):

[program:app] 
command=python run_web_server.py 
stdout_logfile=/var/log/app/app.log 
directory=/opt/app 
autostart=true 
autorestart=false 
stopsignal=INT 
redirect_stderr=true 
startretries=0 
stopasgroup=true 
killasgroup=true 


[unix_http_server] 
file=/var/run/supervisor.sock 
chmod=0700 

[supervisord] 
logfile=/var/log/supervisor/supervisord.log 
pidfile=/var/run/supervisord.pid 
childlogdir=/var/log/supervisor 

[rpcinterface:supervisor] 
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 

[supervisorctl] 
serverurl=unix:///var/run/supervisor.sock 

डोकर उत्पन्न करने के लिए mako टेम्पलेट (बाहर) पर्यवेक्षक फ़ाइल:

[program:container] 
command=docker run --rm --name ${name} \ 
% if container_links is not UNDEFINED: 
% for host in container_hosts: 
--add-host ${host['name']}:${host['ip']} \ 
% endfor 
% endif 
% if container_links is not UNDEFINED: 
% for link in container_links: 
--link ${link}:${link} \ 
% endfor 
% endif 
% if port_mappings is not UNDEFINED: 
% for ext in port_mappings: 
-p ${ext}:${port_mappings[ext]} \ 
% endfor 
% endif 
-e "INSTANCE_NAME=${name}" \ 
-e "TZ=${timezone}" \ 
% if environ is not UNDEFINED: 
% for k in environ: 
-e "${k}=${environ[k]}" \ 
% endfor 
% endif 
-v ${deployment_dir}/tmp:${deployment_dir}/app/tmp \ 
... more -v 
-i foo/app-${version}:${type} 
stdout_logfile=${deployment_dir}/log/${name}.log 
redirect_stderr=true 
autostart=false 
autorestart=false 
% if priority is not UNDEFINED: 
priority=${priority} 
% endif 
startretries=0 
# stopasgroup=true 
# killasgroup=true 
+0

क्या आप पर्यवेक्षक कॉन्फ़िगरेशन फ़ाइलों का एक उदाहरण देखना संभव कर सकते हैं? मैं वही बात कर रहा हूं, और यहां तक ​​कि 'सीएमडी ["निष्पादन योग्य"] का उपयोग कर, पर्यवेक्षक मेरे कंटेनरों को चलाता है। अब मैं चिंतित हूं कि मैं कंटेनर को पहले स्थान पर गलत तरीके से चला रहा हूं। –

+0

निश्चित रूप से। मेरा अपडेट देखें। – orange

+0

बहुत सराहना की! ओह, लेकिन क्या यह कंटेनर के अंदर पर्यवेक्षक के लिए फ़ाइल है, या बाहर? –

संबंधित मुद्दे