Docker工作流

    您的查询搜索没有结果。

    在 Kubernetes 上使用 GoCD 入门

    Docker工作流

    使用 Docker 容器来执行 Docker 命令可以通过以下几种方式实现。本节介绍了这些方法及其使用时需要注意的缺陷。

    Docker in Docker (DinD)

    Docker in Docker 涉及在容器内设置 Docker 二进制文件并运行一个隔离的 Docker 守护进程。这需要主机上的 Docker 容器以特权模式运行。特权标志使主机容器能够执行底层主机几乎所有的操作。我们提供了GoCD Agent DinD镜像,该镜像可以用于在 GoCD 代理中运行与 Docker 相关的任务。

    缺点:

    jpetazzo 在他的博客文章中解释的那样,有些情况下,DinD 可能不适用于您。此外,以特权模式运行容器也存在安全风险。

    Docker Outside of Docker (DooD)

    Docker outside of Docker 涉及将主机的 Docker 套接字挂载到 GoCD 代理容器中,并使用主机的 Docker 守护进程从 CI 中执行与 Docker 相关的命令。

    这需要在 gocd agent 镜像中安装 docker 二进制文件,因为 Docker Engine 不再作为(几乎)静态库分发。

    这可以通过以下方式实现:

    docker run -it -v /var/run/docker.sock:/var/run/docker.sock -e GO_SERVER_URL="https://<go-server-ip>/go" <gocd-agent-image-with-docker>
    

    缺点:

    • 维护一个带有 Docker 的自定义 gocd agent 镜像。
    • 如果 GoCD 代理启动的两个容器具有相同的名称,则可能会发生名称冲突。
    • 考虑构建完成后对容器的清理工作。GoCD 代理容器由弹性代理插件启动和停止。然而,这些临时 GoCD 代理为构建和测试启动的容器不会在构建结束时被插件自动终止。必须在 GoCD 代理关闭之前显式清理它们。此外,镜像层会被缓存和重用,导致构建隔离丢失。
    • 这种方式启动的容器超出了 Helm 的范围,且不易访问。

    使用单个 Docker GoCD 代理镜像

    在 DinD 和 DooD 都不适用于您的用例的情况下,另一种选择是将所有构建时依赖项打包到一个单一的 Docker 镜像中。使用此 Docker 镜像与 GoCD 弹性代理一起运行构建任务。只有在您不选择将应用程序的构建和测试容器化时,这种方法才适用。换句话说,这种工作流非常适合不涉及使用弹性代理运行与 Docker 相关命令的情况。