Выключение контейнеров Docker через супервизор

я не могу закрыть контейнеры Docker, которые были запущены супервизором через supervisorctl stop all. Даже через supervisorctl status показывает, что контейнеры опущены,docker ps и ps укажите, что они на самом деле все еще работают.

консультации с документацией супервизора по действию для supervisorctl stop <name> выявлено, что SIGTERM отправляется в процессы, за которыми следует SIGKILL если еще работает после некоторого льготного периода. Я попытался сделать это вручную и нашел это

  • SIGTERM отправлено

1 ответов


думаю, я нашел проблему. Я этого не понимал, но есть несколько способов запуска программы при запуске контейнера docker.

видимо CMD myexec param1 param2 запускает оболочку, которая, в свою очередь, начинается myexec (на самом деле эти два процесса видны в контейнере с /bin/sh -c myexec... на PID 1. Лучший способ-запустить программу напрямую (в моем случае supervisord).

С другой стороны, CMD ["/usr/bin/python", "/usr/local/bin/supervisord", "-c", "/root/supervisord.conf", "--nodaemon"] работала нормально. Теперь я могу запустить и остановить контейнер docker через начальника.

здесь соответствующий раздел в документах docker:

инструкция CMD имеет три формы:

CMD ["executable","param1","param2"] (форма exec, это предпочтительная форма)

CMD ["param1","param2"] (в качестве параметров по умолчанию для ENTRYPOINT)

CMD command param1 param2 (форма раковины)

обновление

пример файла супервизора (внутри Docker контейнер):

[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 для создания файла супервизора Docker (outside):

[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