You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Nginx将Artifactory作为Docker Registry的问题求助

排查Jenkins推送Docker镜像到Artifactory的异常问题

看起来你在Jenkins推送Docker镜像到Artifactory的过程中卡壳了——虽然基础的HTTP/HTTPS访问Artifactory没问题,但镜像推送就是掉链子,这种情况我碰到过不少,咱们一步步来排查:

1. 先确认Docker Daemon的证书信任配置

虽然你说客户端已安装信任自签名证书,但Docker daemon有自己独立的证书存储逻辑,系统层面的信任不一定生效:

  • 在Jenkins所在机器(如果Jenkins是容器部署,要确保证书挂载到了容器内对应路径),把你的自签名CA证书放到/etc/docker/certs.d/<你的子域名>/ca.crt目录下(比如子域名是docker.artifactory.example.com,路径就是/etc/docker/certs.d/docker.artifactory.example.com/ca.crt)。
  • 如果是Windows/Mac的Docker Desktop,需要在Settings > Docker Engine里添加CA证书,或者在Settings > Resources > Certificates中导入证书。
  • 重启Docker daemon后,先手动执行docker login <你的子域名>测试登录是否成功,这一步能排除证书和凭证的基础问题。

2. 检查Nginx反向代理的Docker适配配置

Docker Registry的API对反向代理有特殊要求,Nginx默认配置可能满足不了:

  • 在对应子域名的Nginx配置块里,必须添加以下关键配置:
    location / {
        client_max_body_size 0;  # 允许大文件上传(镜像体积通常很大)
        proxy_pass http://<artifactory容器IP>:8081;  # 替换为你的Artifactory容器内部IP或服务名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300;  # 延长超时时间,避免大镜像上传超时
    }
    
  • 确认Nginx的SSL配置启用了兼容的协议:ssl_protocols TLSv1.2 TLSv1.3;,避免因TLS版本不兼容导致握手失败。
  • 重启Nginx后,用curl -v https://<你的子域名>/v2/测试,应该返回200 OK或401 Unauthorized(未登录的情况),如果返回其他状态码,说明Nginx转发有问题。

3. 核对Artifactory的Docker仓库配置

Artifactory的Docker仓库模式必须和你的子域名代理匹配:

  • 进入Artifactory后台,找到对应的Docker仓库,确认Repository Settings > Docker > Repository Layout选择的是Subdomain模式,而不是Path模式——子域名模式下,Artifactory会通过子域名识别仓库,这和你的反向代理配置匹配。
  • 检查仓库的权限:Jenkins使用的账号必须拥有该仓库的Deploy权限,如果你没开启匿名部署,一定要确保Jenkins配置了正确的Docker凭证(用户名+密码/API令牌)。

4. 从日志中定位具体错误

如果前面的检查都没问题,就需要通过日志找根源:

  • 在Jenkins构建中,把docker push命令加上--debug参数,比如:
    docker push --debug <你的镜像名>:<标签>
    
    从debug日志里可以看到是TLS握手失败、权限错误还是路径不存在等具体问题。
  • 查看Nginx的日志:/var/log/nginx/access.log和error.log,看请求是否到达Nginx、转发状态码是什么。
  • 查看Artifactory的请求日志:进入Artifactory容器,查看/var/opt/jfrog/artifactory/logs/artifactory-request.log,看请求是否到达Artifactory,有没有被拒绝的记录。

5. 排除Jenkins自身的环境问题

如果手动推送镜像成功,但Jenkins推送失败,那问题大概率在Jenkins配置:

  • 确认Jenkins容器是否正确挂载了Docker daemon的socket(比如/var/run/docker.sock:/var/run/docker.sock),或者Jenkins是否安装了正确的Docker客户端插件,且版本和Docker daemon兼容。
  • 检查Jenkins的凭证配置:确保Docker凭证的类型是Username with password,且用户名、密码/令牌正确,推送时指定了正确的凭证ID。

先从手动测试和日志排查入手,把范围缩小,大部分这种情况要么是证书没给Docker daemon配置对,要么是Nginx的反向代理漏掉了Docker需要的配置项,或者Artifactory的仓库模式没选对。

内容的提问来源于stack exchange,提问作者ppapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:15:08