首页 > 解决方案 > 如何使用 docker:dind 图像运行单个命令(任务)容器

问题描述

我正在尝试拥有一个docker:dind运行单个命令然后退出的容器。所有示例都基于守护进程容器,我试图避免这种情况,我希望容器在入口点进程完成后退出。

开箱即用,docker:dindimage 规定了 的入口点dockerd-entrypoint.sh,该入口点启动然后保持在其中运行的实际 docker 守护进程。实际上,这个容器现在提供了一项服务——我可以“执行”它,并运行嵌套容器:

$ docker run --rm --privileged -t -i docker:dind &
$ docker exec -it <conatiner_name> sh
/ # docker run -it --rm fedora
[root@xxxx /] #

但是,我不希望它提供服务。我想要的是每次运行一个新容器来执行任务。一项涉及创建和使用嵌套容器的任务,一旦任务完成,我希望容器停止。docker:dind因此,我将根据以下示例创建自己的图像Dockerfile

FROM docker:dind
COPY my_task.sh /

如果我替换默认入口点,显然没有任何 DIND 魔法运行,并且 DIND 不可用。

然而dockerd-entrypoint.sh,入口点确实接受参数。如果在启动时提供了参数,则dockerd-entrypoint.sh脚本改为调用docker-entrypoint.sh,则 docker 守护程序未启动,环境变量$DOCKER_HOST设置为tcp://docker:2375,无法解析。我不明白该功能的意义(它可能仅适用于无根变体)。

$ docker run --rm --privileged -t -i docker:dind sh
/ # export |grep DOCKER
export DOCKER_HOST='tcp://docker:2375'
export DOCKER_TLS_CERTDIR='/certs'
export DOCKER_VERSION='20.10.9'
/ # docker ps
error during connect: Get "http://docker:2375/v1.24/containers/json": dial tcp: lookup docker on 192.168.83.1:53: no such host

在测试时,我已将入口点更改为/bin/sh,然后尝试dockerd-entrypoint.sh从该 shell 运行(我的“任务脚本”会这样做)。这会正确启动守护进程,但 shell 会保留 docker 守护进程,并且无法用于进一步的命令。尝试dockerd-entrypoint.sh使用作业控制在后台运行会导致守护程序启动后立即退出。

因此,最后,覆盖入口点,然后运行setsid -f dockerd-entrypoint.sh似乎确实有效 - 守护程序正确进入后台,shell 可以自由执行其他命令,并且容器在 shell 执行时退出。

但是,感觉好像我在这里遗漏了一些东西,例如默认入口点脚本应该作为包装器工作,并为它包装的任何命令“提供” DIND 功能。

那么,运行单个任务 DIND 容器的正确方法是什么?

标签: dockerdocker-in-docker

解决方案


推荐阅读