Jenkins Docker插件报错:客户端向HTTPS服务器发送HTTP请求(400状态码)
解决Jenkins Docker DIND配置中的HTTP请求到HTTPS服务器报错
报错原因分析
com.github.dockerjava.api.exception.BadRequestException: Status 400: Client sent an HTTP request to an HTTPS server 本质是Jenkins的Docker插件尝试用HTTP协议连接启用了TLS的Docker DIND服务(2376端口默认走HTTPS),或者配置存在冲突导致协议不匹配。
解决方案步骤
1. 移除宿主机Docker Socket挂载(关键)
你添加的--volume /var/run/docker.sock:/var/run/docker.sock会导致Jenkins容器内同时存在两种Docker访问方式:
- DIND的HTTPS服务(tcp://docker:2376)
- 宿主机的HTTP Socket(/var/run/docker.sock)
Docker插件可能优先使用Socket,但配置却指向2376端口,直接引发协议冲突。必须移除这个挂载卷,DIND模式不需要依赖宿主机Docker。
2. 验证DIND容器的TLS证书生成
进入DIND容器检查证书是否正常生成:
docker exec -it jenkins-docker ls /certs/client
需看到ca.pem、cert.pem、key.pem三个文件。如果缺失,清理现有资源后重新启动:
docker stop jenkins-docker jenkins-blueocean docker rm jenkins-docker jenkins-blueocean docker volume rm jenkins-docker-certs jenkins-data docker network create jenkins
重新启动DIND容器,等待10秒让证书生成完成,再用你提供的原始命令启动Jenkins容器(去掉socket挂载)。
3. 修正Jenkins Docker Cloud配置
在Jenkins后台进入「Manage Jenkins」→「Manage Nodes and Clouds」→「Configure Clouds」→「Docker」:
- 服务器URL:必须填写
tcp://docker:2376(不要加http://前缀) - 勾选「Enable Docker TLS」选项
- 证书路径:填写
/certs/client(对应容器内挂载的证书卷路径) - 无需手动上传证书,卷已经挂载了DIND生成的证书文件
4. 验证Jenkins容器内环境变量
进入Jenkins容器确认环境变量配置正确:
docker exec -it jenkins-blueocean env | grep DOCKER
需输出:
DOCKER_HOST=tcp://docker:2376 DOCKER_CERT_PATH=/certs/client DOCKER_TLS_VERIFY=1
完成以上步骤后,重新测试Docker Cloud的连接,即可解决HTTP/HTTPS协议不匹配的报错。
内容的提问来源于stack exchange,提问作者itmaybehimm
相关产品推荐
相关产品推荐

