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