Выключение контейнеров 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