Запуск контейнера как потомка сервиса Swarm - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно запустить контейнер («дочернее» изображение), который имеет доступ к графическому процессору для ускорения кодирования видео, но мне также нужно, чтобы он был организован Swarm.Файл compose (файл стека) ниже эффективно запускает дочернее изображение, но когда стек удаляется, дочерний контейнер остается бесхозным.Я стараюсь не запускать Docker-in-Docker для превосходного блога Жерома Петаццони .Существуют ли какие-либо дополнительные метки, которые я пропускаю, чтобы связать дочерний контейнер с родительским сервисом - что позволяет Swarm управлять дочерним контейнером через родительский сервис?

version: "3.7"
services:
  parent-service:
    image: docker:stable
    entrypoint: [sh, -c]
    environment:
      TASK_NAME: '{{.Task.Name}}'
    command: >-
      'exec docker run
      --interactive
      --device=/dev/dri/renderD128:/dev/dri/renderD128
      --label com.docker.stack.namespace=$$(docker container inspect --format "{{index .Config.Labels \"com.docker.stack.namespace\"}}" $${TASK_NAME})
      --volumes-from=$${TASK_NAME}
      --rm
      child:latest'
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock

1 Ответ

0 голосов
/ 28 сентября 2019

Оказывается, это довольно просто в Docker, если вы сохраняете нетронутыми цепочку PID контейнера коляски (дочернего элемента) и правильно управляете сигналами ОС.Если цепочка PID остается неизменной, дочерний контейнер получит сигнал SIGTERM, когда родительская служба завершит работу.Мы столкнулись с 3 случаями, с которыми нам приходится иметь дело;1.) контейнер непосредственно запускает наше приложение, которое мы можем контролировать, чтобы гарантировать обработку сигналов, 2.) приложение контейнера - это стороннее приложение, которое работает под оболочкой и правильно обрабатывает сигналы, и 3.) приложение контейнера не обрабатывает сигналы должным образом.

  1. В этом случае ваше приложение имеет идентификатор PID 1, поэтому вы убедитесь, что оно правильно обрабатывает сигналы, такие как SIGTERM, и завершает работу приложения, чтобы избежать использования контейнеров-зомби.
  2. В этом случаеЦепочка PID поддерживается путем выполнения приложения под оболочкой с помощью 'exec', который переводит PID 1 контейнера из оболочки в приложение.
  3. В этом последнем случае вы можете запустить приложение контейнера, используя dumb-init , который будет управлять сигналами от имени приложения.В этом случае убедитесь, что dumb-init равен PID 1.
...