【问题标题】:Jenkins docker container behind proxy refuses to download plugins cert error代理后面的Jenkins docker容器拒绝下载插件证书错误
【发布时间】:2021-12-30 08:46:40
【问题描述】:

问题:

部署 Jenkins 时,在安装插件时,每个插件都无法下载并出现以下 Java 错误:

Caused: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

疑难解答:

  • 部署在环境中而不是在代理后面,这工作正常。
  • 尝试更改 docker 映像类型(使用“jenkins”和“jenkinsci”均无效)找到信息here
  • 阅读所有this post 那里没有任何帮助。
  • jenkins 似乎正试图从 URL 中提取插件,但无法验证证书。我尝试为“-k”添加 curl 选项,但这没有帮助。我还尝试在容器外使用 curl 下载以查看发生了什么。看来我需要使用“-kL curl --proxy our.proxy.com:1234”来实际拉取插件网址并让它工作。但是,当添加 ENV CURL_OPTIONS -Lk --proxy our.proxy.com:1234 并启动容器时,我仍然看到相同的错误。
  • 尽管阅读this post 以及如何将 URL 列入白名单,但我认为这不是我们的问题,因为 A)我能够从一个镜像中提取而无需调整我们的代理 B)错误说这是一个认证路径问题。
  • 为什么我可以通过容器外的 curl+proxy 获取插件 url,但是当 Java 尝试这样做时,我得到证书错误?从 docker log 输出中我不清楚用于提取插件的 java 命令,所以我不确定发生了什么。
  • 是否有从 Java 禁用证书验证的选项?我现在只需要它作为 POC 工作,所以我现在不关心验证检查,我可以稍后实现。这也是通过代理,我无权访问代理 CA 信任或证书。只想停用任何建议?

环境:

  • Ubuntu 服务器 18.04
  • Docker 版本:20.10.10
  • Docker 组合版本:1.29.2

配置文件:

  • Docker 编写文件:
version: '3.7'
services:
  jenkins:
    container_name: jenkins
    build:
      context: ./jenkins
      dockerfile: ./jenkins.Dockerfile
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - jenkins-data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      DOCKER_SOCKET: /var/run/docker.sock
      ALL_PROXY: "http://our.proxy.com:1234"
      JAVA_OPTS: "-Dhttp.proxyHost=our.proxy.com -Dhttp.proxyPort=1234 -Dhttps.proxyHost=our.proxy.com -Dhttps.proxyPort=1234"

    privileged: true

volumes:
    jenkins-data:
  • Docker 文件:
FROM jenkins/jenkins:latest
USER root
ENV CURL_OPTIONS -k --proxy our.proxy.com:1234

【问题讨论】:

    标签: java docker jenkins certificate containers


    【解决方案1】:

    如果运行环境不能安装插件,那么可以在可以访问更新中心的环境中,通过plugins.txt文件配置要安装的插件。在更新中心可用的环境中构建容器镜像,然后将镜像复制到最终目的地。

    一个例子是在https://github.com/MarkEWaite/docker-lfs/tree/lts-with-plugins 中,它将插件二进制文件作为大文件存储在 Git 存储库中,并在 plugins.txt 文件中定义了精确的插件版本。生成的容器映像包含插件,因此不需要访问更新中心。

    【讨论】:

    • 是的,我避免手动移动容器,但我放弃了。这不是我发布的问题的解决方案,但它允许我的项目向前推进。我按照这里的说明转移了一个安装了我需要的所有插件的工作 Jenkins:stackoverflow.com/a/53068212/7211014
    猜你喜欢
    • 2016-09-05
    • 2014-12-01
    • 2020-11-25
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2019-01-30
    相关资源
    最近更新 更多