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