![Docker 中的 Docker - 如何确保它在运行之后被清理?](https://linux22.com/image/781827/Docker%20%E4%B8%AD%E7%9A%84%20Docker%20-%20%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E5%AE%83%E5%9C%A8%E8%BF%90%E8%A1%8C%E4%B9%8B%E5%90%8E%E8%A2%AB%E6%B8%85%E7%90%86%EF%BC%9F.png)
我为我们的本地 DevOps 管道构建了一个基于 Swarm 的 Docker 设置。基于 Docker 的管道代理已启动并可以执行构建操作。我还有几个能够构建新 Docker 映像的代理 - 这是通过从\\.\pipe\docker_engine
主机与这些容器绑定来实现的。
这通常有效……但是,如果构建过程出现问题,它可能会留下大量垃圾。这可以通过使用 部分缓解--force-rm
。但理想情况下,我希望容器在运行后自行清理,以便下次运行是“原始”的,无论其中运行了什么。我还想让这些特殊容器为更复杂的 CI 管道启动新容器,但同样 - 我担心它们不会自行清理。注意:我不太担心安全性,因为这些都是“内部”的东西。
是否有可能有一个容器可以在其内部启动嵌套容器,同时确保如果这个顶部容器被停止和删除,那么这个容器创建的所有内容也将被停止和删除?
答案1
如果您在 dind(Docker in Docker)容器中以后台方式运行容器,则可以存储进程 ID 并确保正确清理。清理可以挂接到中断或终止信号上。
这是一个示例脚本,您必须在 dind-container 启动时执行它:
#!/bin/sh
cnt_name="dindContainer"
# intercept SIGINT and SIGTERM and hook a function onto them
trap 'cleanup' INT TERM
cleanup() {
if [ -n "$ctr_proc" ]; then
kill -TERM "$ctr_proc"
else
docker stop "$cnt_name" > /dev/null 2>&1
sleep 5
fi
}
cleanup
docker run \
--rm \
--name="$cnt_name" \
alpine \
sleep 1000 &
# store the container process id and wait for it to finish
ctr_proc=$!
wait "$ctr_proc"