Harbor镜像仓库必须使用HTTPS协议,Docker客户端默认拒绝HTTP推送;需配置有效TLS证书或显式设置insecure-registries;镜像tag必须含完整registry前缀;Project权限和robot account登录为必要安全措施。

Harbor 镜像仓库地址必须用 HTTPS,否则 Docker client 拒绝推送
Go 微服务本身不直接“配置” Harbor,真正要配的是构建和部署环节的 Docker 客户端行为。很多团队在本地 docker push 时报错 denied: requested access to the resource is denied 或 unauthorized: authentication required,根源常是 Harbor 地址用了 HTTP —— 即使你关掉了 TLS 强制校验,Docker 18.06+ 默认禁用 insecure registry,除非显式配置。
实操建议:
- 确保 Harbor 域名(如
registry.example.com)已配置有效 TLS 证书,推荐用certSource: auto+ Let’s Encrypt(Helm 部署时启用) - 若测试环境确需 HTTP,必须在每台构建机的 Docker daemon 配置中加入:
"insecure-registries": ["registry.example.com:80"],然后重启dockerd - Go 项目 CI 脚本里不要硬编码
http://,统一用变量或配置项控制协议头
Go 微服务镜像打 tag 时,registry 前缀不能漏
Go 编译生成二进制后构建成镜像,docker build 本身不关心 Harbor,但 docker tag 必须带上完整 registry 地址,否则 docker push 会默认推到 Docker Hub。
常见错误现象:执行 docker push myapp:v1.2.0 后发现镜像出现在 Docker Hub,而不是你的 Harbor。
立即学习“go语言免费学习笔记(深入)”;
正确做法:
- 构建后立即打带 registry 前缀的 tag:
docker tag myapp:v1.2.0 registry.example.com/myproject/myapp:v1.2.0 - 项目根目录下放
.env文件定义:HARBOR_REGISTRY=registry.example.com,CI 脚本引用它动态生成 tag - 避免使用短名(如
myapp)或 localhost 地址(如localhost:5000/myapp),Harbor 不认这种非 FQDN 地址
Harbor 项目(Project)权限必须提前分配,否则 push 失败
Harbor 的 RBAC 是按 “Project” 维度控制的,不是全局用户权限。即使你用 admin 登录过 Web UI,docker login 成功,也不代表能往任意项目 push 镜像。
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
典型报错:unauthorized: unauthorized to access repository: myproject/myapp, action: push: forbidden
解决路径:
- 登录 Harbor Web UI,进入目标 Project(如
myproject)→ “Members” → 添加用户并赋予Developer或Maintainer角色 - 若用 LDAP/OIDC 认证,确认该用户所属 group 已被映射到对应 Project 角色(Harbor 后台 “Configuration” → “Authentication” 中检查 group mapping)
- CI 流水线建议用专用机器人账号(如
ci-bot),避免共用个人账号,方便审计和权限回收
Go 微服务 CI 中的 docker login 必须用 Harbor 提供的 token 或 robot account
直接用 admin 密码写进 CI 脚本是高危操作,且 Harbor v2.4+ 默认禁用密码明文登录(尤其开启 LDAP 后)。更安全、更稳定的方式是用 robot account。
robot account 特点:
- 生命周期可控,可设过期时间
- 权限绑定到具体 Project,最小权限原则
- token 一次性生成,不会因用户密码变更而失效
操作步骤:
- 在 Harbor Web UI 进入 Project → “Robot Accounts” → 创建新 robot(如
robot-ci-myproject),勾选pull/push - CI 脚本中用:
echo "$ROBOT_TOKEN" | docker login registry.example.com -u "robot$ci-myproject" --password-stdin -
$ROBOT_TOKEN存为 CI 平台密钥(如 GitHub Secrets / GitLab Variables),绝不硬编码
Harbor 的 robot account 名固定带 robot$ 前缀,注意拼写;token 是 Base64 编码字符串,但 docker login 接收明文,无需解码。

















