1

我有一个带有主节点和多个工作/从节点的 Jenkins 设置。工作人员是在虚拟机上运行的 docker 容器。容器本身没有运行(也没有安装)docker 守护进程。他们/var/run/docker.sock为此从主机安装。

当我构建映像时,它无法包含我作为绑定添加到构建中的一些 CA 证书。

我的应用程序设置(Spring Boot + Gradle)如下:

user@nb [~/dev/project]
-> % tree ./ca-certificates
./ca-certificates
└── [drwxr-xr-x 4.0K]  binding
    ├── [-rw-r--r-- XXXK]  newRootCA.pem
    ├── [-rw-r--r-- XXXK]  newInterCA.pem
    └── [-rw-r--r--   16]  type

1 directory, 4 files
user@nb [~/dev/project]
-> % cat ./ca-certificates/binding/type 
ca-certificates
user@nb [~/dev/project]
-> % 

我将此文件夹作为绑定安装在我的gradle任务中(来自 Spring Boot Gradle 插件)

tasks.bootBuildImage {
    enabled = project.hasProperty("withDocker")
    ...
    binding("${projectDir}/ca-certificates/binding:/platform/bindings/ca-certificates")
    ...
}

在我的本地机器上,这按预期工作。

user@nb [~/dev/project]
-> % ./gradlew build -PwithDocker
...
 > Running creator
    [creator]     ===> DETECTING
    [creator]     5 of 18 buildpacks participating
    [creator]     paketo-buildpacks/ca-certificates   2.4.2
    [creator]     paketo-buildpacks/bellsoft-liberica 8.8.0
    [creator]     paketo-buildpacks/executable-jar    5.3.1
    [creator]     paketo-buildpacks/dist-zip          4.3.0
    [creator]     paketo-buildpacks/spring-boot       4.7.0
...
    [creator]     Paketo CA Certificates Buildpack 2.4.2
    [creator]       https://github.com/paketo-buildpacks/ca-certificates
    [creator]       Launch Helper: Reusing cached layer
    [creator]       CA Certificates: Contributing to layer
    [creator]         Added 2 additional CA certificate(s) to system truststore
    [creator]         Writing env.build/SSL_CERT_DIR.append
    [creator]         Writing env.build/SSL_CERT_DIR.delim
    [creator]         Writing env.build/SSL_CERT_FILE.default
...

在 Jenkins 上运行构建时,缺少带有附加 CA 证书的输出。并且生成的容器不包含它们。

经过两天的搜索,我发现这是因为 Jenkins slave 的设置。构建运行时,docker 守护程序(在主机系统上运行)不知道/无法访问项目目录,因此无法将包含 pem 文件的文件夹挂载到构建容器。它不会抛出任何错误。它会在主机系统上创建目录/home/jenkins/workspaces/project/ca-certificates/binding(然后将空文件夹挂载到构建容器,我猜)。

我认为这是环境中卷和 docker 容器的普遍问题,其中 docker 守护进程无法访问客户端的文件系统。我和一位同事一起发现了这个问题,该同事目前正在测试在 Minikube 中安装 docker 守护程序作为 Mac 和 Windows 上 Docker Desktop 的替代方案。

我现在只能想到两个解决这个问题的方法:在我所有的 Jenkins 从站中安装 docker 守护进程,或者构建和使用我自己的构建器镜像,它已经包含了证书。

这两种解决方案都有其缺点。在实现第一个时,我需要在我的所有奴隶中处理我的私人注册表的凭据。后者需要定期构建新版本以获取构建器映像的更新。此外,这只会修复这种特定情况,我需要容器中的这三个特定文件。

你还有别的想法吗?

提前致谢!

4

0 回答 0