Docker 作为Swarm服务的子级运行容器

Docker 作为Swarm服务的子级运行容器,docker,docker-swarm,Docker,Docker Swarm,我需要运行一个容器(“子”图像),该容器可以访问GPU进行视频编码加速,但我还需要Swarm对其进行协调。下面的合成文件(堆栈文件)可以有效地启动子映像,但当移除堆栈时,子容器将处于孤立状态。我试图避免在Docker per中运行Docker。为了让子容器链接到父服务——允许Swarm通过父服务编排子容器,我是否还缺少其他标签 version: "3.7" services: parent-service: image: docker:stable entrypoint: [

我需要运行一个容器(“子”图像),该容器可以访问GPU进行视频编码加速,但我还需要Swarm对其进行协调。下面的合成文件(堆栈文件)可以有效地启动子映像,但当移除堆栈时,子容器将处于孤立状态。我试图避免在Docker per中运行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

事实证明,在Docker中,只要保持sidecar容器(子容器)的PID链完好无损,并正确管理操作系统信号,这是非常简单的。如果PID链保持不变,则当父服务终止时,子容器将收到SIGTERM信号。我们遇到了3个需要处理的案例;1.)容器直接运行我们的应用程序,我们可以控制它以确保信号得到处理;2.)容器应用程序是在shell下运行的第三方应用程序,可以正确处理信号;3.)容器应用程序不能正确处理信号

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