作为Swarm服务的子代运行容器

时间:2019-09-19 23:09:57

标签: docker docker-swarm

我需要运行一个可以访问GPU来进行视频编码加速的容器(“子”图像),但是我也需要由Swarm对其进行编排。下面的撰写文件(堆栈文件)有效地启动了子映像,但是当删除堆栈时,子容器将保持孤立状态。我试图避免按Jérôme Petazzoni's excellent blog运行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 :(得分:0)

事实证明,只要保持Sidecar容器(子代)的PID链完整并正确管理OS信号,这在Docker中是非常简单的。如果PID链保持完整,则当父服务终止时,子容器将收到SIGTERM信号。我们遇到了3个要处理的案件; 1.)容器直接运行我们的应用程序,我们可以控制该应用程序以确保信号得到处理; 2。)容器应用程序是在外壳下运行并正确处理信号的第三方应用程序; 3。)容器应用程序无法正确处理信号。

  1. 在这种情况下,您的应用程序是PID 1,因此请确保它能够正确处理信号(例如SIGTERM)并终止应用程序以避免僵尸容器。
  2. 在这种情况下,通过使用'exec'在shell下执行应用程序来维护PID链,这会将容器的PID 1从shell转换到应用程序。
  3. 对于最后一种情况,您可以使用dumb-init启动容器应用程序,它将代表该应用程序管理信号。在这种情况下,请确保dumb-init为PID 1。