如何修改Jenkins Helm Chart引用镜像中的Java cacerts文件以解决证书错误?
解决Jenkins Helm Chart部署时自签名SSL证书导致的PKIX错误
遇到这种自签名证书引发的Java证书信任问题,不用修改Helm Chart源码,下面几种方法都能解决:
方法1:自定义Jenkins镜像(最稳妥)
直接基于官方Jenkins镜像,把你的自定义cacerts文件嵌进去:
- 写个简单的Dockerfile:
FROM jenkins/jenkins:2.387.1-jdk11 # 把本地的自定义cacerts复制到镜像里的Java安全目录 COPY your-custom-cacerts /usr/local/openjdk-11/lib/security/cacerts
- 构建镜像并推到你们的私有镜像仓库:
docker build -t 你的私有仓库地址/jenkins-custom-cacerts:2.387.1-jdk11 . docker push 你的私有仓库地址/jenkins-custom-cacerts:2.387.1-jdk11
- 部署Helm Chart时指定这个自定义镜像,比如修改
values.yaml:
controller: image: repository: 你的私有仓库地址/jenkins-custom-cacerts tag: 2.387.1-jdk11
或者直接用命令行参数:
helm install jenkins jenkinsci/jenkins \ --set controller.image.repository=你的私有仓库地址/jenkins-custom-cacerts \ --set controller.image.tag=2.387.1-jdk11
方法2:用ConfigMap挂载替换cacerts(不用构建镜像)
如果不想做自定义镜像,直接用K8s的ConfigMap把cacerts挂进去:
- 先把你的自定义
cacerts文件做成ConfigMap:
kubectl create configmap jenkins-custom-cacerts --from-file=./your-custom-cacerts
- 修改Helm的
values.yaml,添加挂载配置:
controller: extraVolumeMounts: - name: custom-cacerts mountPath: /usr/local/openjdk-11/lib/security/cacerts subPath: your-custom-cacerts # 对应ConfigMap里的文件名 readOnly: true extraVolumes: - name: custom-cacerts configMap: name: jenkins-custom-cacerts
注意:不同JDK版本的cacerts路径不一样,比如JDK8是/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts,不确定的话可以先跑个官方镜像看看路径:
docker run --rm -it jenkins/jenkins:2.387.1-jdk11 bash -c "find / -name cacerts"
方法3:用Init容器复制cacerts
如果挂载直接替换有问题(比如权限或路径锁定),可以用Init容器先把文件复制到共享卷:
- 先按方法2创建好ConfigMap,然后修改
values.yaml:
controller: initContainers: - name: copy-cacerts image: busybox:latest command: ['sh', '-c', 'cp /custom-cacerts/your-custom-cacerts /shared-cacerts/cacerts && chmod 644 /shared-cacerts/cacerts'] volumeMounts: - name: custom-cacerts mountPath: /custom-cacerts - name: shared-cacerts mountPath: /shared-cacerts extraVolumes: - name: custom-cacerts configMap: name: jenkins-custom-cacerts - name: shared-cacerts emptyDir: {} extraVolumeMounts: - name: shared-cacerts mountPath: /usr/local/openjdk-11/lib/security/cacerts subPath: cacerts readOnly: true
额外注意点
- 确保自定义
cacerts的权限和原文件一致,一般是644 - 替换后可以进入Jenkins容器验证:
kubectl exec -it <jenkins-pod> -- keytool -list -keystore /usr/local/openjdk-11/lib/security/cacerts,看是否包含你的自签名证书
内容的提问来源于stack exchange,提问作者John Fisher
相关产品推荐
相关产品推荐

