Как остановить конкретный докер-контейнер с помощью Python - PullRequest
0 голосов
/ 11 июля 2019

У меня есть файл для создания Docker, который запускает базу данных, веб-сервер и рабочий.Нашим пользователям, возможно, понадобится запустить дополнительных работников, и у меня это работает (используя "... up --scale worker = x").Пользователь также может захотеть остановить конкретного работника.Здесь я сталкиваюсь с неприятностями.В командной строке я могу использовать «docker stop worker_name», и это работает нормально, но не тогда, когда я вызываю его из Python, используя подпроцесс.Я видел ссылку на использование docker-compose stop, но разве docker-compose не подходит к вашему файлу yml?Как вы могли бы использовать его, чтобы остановить один контейнер?Мы используем Python 3.7.1 в Ubuntu 18.04.Версия Docker 18.06.

Вот фрагмент кода из Python для остановки рабочего.

kwargs - { 'shell': True,
   'stdout': subprocess.PIPE,
   'stderr': subprocess.PIPE,
   'universal_newlines': True
   }
worker_name = 'worker_1'
cmd = f'docker stop {worker_name}'
proc = subprocess.Popen(cmd, **kwargs)
out, err = proc.communicate()
self.logger.info(f'out = {out}')
self.logger.info(f'err = {err}')

1 Ответ

0 голосов
/ 12 июля 2019

Снято в темноте:

Когда вы используете docker stop в командной строке, контейнер останавливается сразу или существует значительная задержка? (*) Если последний в контейнере запускается рабочим с помощью сценария без использования exec ? В этом случае SIGTERM / SIGINT отправляется главному процессу контейнера, который является сценарием и который ничего не может с ним сделать, поскольку элемент управления находится в основном рабочем коде.

Чтобы быть точным, стартовый скрипт должен exec основной рабочий код, чтобы рабочий стал основным процессом контейнера (или, точнее, основным процессом контейнера станет рабочий код). SIGINT / SIGTERM будет обработан этим процессом, и контейнер своевременно остановится.

(*) когда вы делаете docker stop, контейнер отправляет SIGINT (или это SIGTERM); и если он не завершается своевременно (10 секунд IIRC), то ему дают топор с SIGKILL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...