docker - 如何使用 docker:dind 图像运行单个命令(任务)容器
问题描述
我正在尝试拥有一个docker:dind
运行单个命令然后退出的容器。所有示例都基于守护进程容器,我试图避免这种情况,我希望容器在入口点进程完成后退出。
开箱即用,docker:dind
image 规定了 的入口点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 容器的正确方法是什么?
解决方案
推荐阅读
- vue.js - Nuxt/Vuetify - v-autocomplete not displaying the v-menu
- excel - 如果列包含特定单词,则使用 Excel 宏更改列的颜色
- android - 长时间后从后台打开应用程序崩溃
- javascript - 如何运行嵌套在两个 setTimeout() 之间的函数?
- python - 在 Python 中重命名文件名的开头
- bash - 如何在终端中显示我的 Git 分支并自动更新?
- python - “就地” Cython 功能是否可能?
- pdf - Google CSE(自定义搜索引擎)不返回 PDF/Youtube 结果
- python - 如何将 Flask 表格单元格值传递给 python 函数?
- docker - 找不到 Docker 文件系统