我有一个带有主节点和多个工作/从节点的 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 守护进程,或者构建和使用我自己的构建器镜像,它已经包含了证书。
这两种解决方案都有其缺点。在实现第一个时,我需要在我的所有奴隶中处理我的私人注册表的凭据。后者需要定期构建新版本以获取构建器映像的更新。此外,这只会修复这种特定情况,我需要容器中的这三个特定文件。
你还有别的想法吗?
提前致谢!