Docker 中的 Docker - 如何确保它在运行之后被清理?

Docker 中的 Docker - 如何确保它在运行之后被清理?

我为我们的本地 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"

相关内容