如何发送Portainer Webhook重建容器 解决私有仓库认证报错
问题根因
别绕,这个报错本质是你加认证的地方完全错了。
报no basic auth credentials是跑服务的Docker节点拉私有镜像的时候没拿到仓库凭证,和你给Webhook请求加什么认证头半毛钱关系没有——你在Postman给发往Portainer的请求塞Registry的账号密码,Portainer根本不会把这个凭证传给底层Docker daemon,纯纯做无用功。
解决步骤
- 先检查Portainer的私有仓库配置
进后台Registries菜单,找到你加的registry.mydomain条目,确认填的仓库用户名、密码是对的,还要把所有跑业务容器的Docker节点都勾上这个仓库的访问权限,存好配置。 - 给对应服务绑定拉取凭证
找到你开了Webhook的my-gateway服务/容器,进编辑页:- Swarm模式的Service:找到
Registry authentication下拉框,直接选你刚才配置好的registry.mydomain对应的凭证,别留空选默认项 - 单机部署的容器:在镜像拉取配置区,同样选中对应私有仓库的认证凭证
配完手动点一次更新服务,确认这次能正常拉到镜像,不抛认证错误,这步过了Webhook才能正常用。
- Swarm模式的Service:找到
- 正确构造Webhook请求
Portainer v2.13.1的Webhook本身URL里带的随机串就是鉴权凭证,不需要额外加任何请求头、不需要带任何请求体,不管用curl还是Postman,直接发POST请求到生成的Webhook地址就行。
举个curl调用的例子:
用Postman的话就选POST方法,URL填对,Body选none,Authorization选No Auth,直接发就成。curl -X POST "https://你的Portainer访问地址/api/webhooks/3fa85f64-5717-4562-b3fc-2c963f66afa6"
避坑提醒
- 别再给Webhook请求加Registry的Basic Auth了:请求是打给Portainer的,不是打给镜像仓库的,加了Portainer也不认,没用
- 多节点Swarm集群的话,要确认所有可能调度到这个服务的节点,都在私有仓库的授权访问列表里,不然服务飘到没权限的节点照样拉镜像失败
- 如果你之前是在宿主机手动
docker login过私有仓库,记得检查下/root/.docker/config.json里的凭证有没有过期,Portainer没单独配仓库凭证的时候会默认读宿主机的这个配置,过期了也会报同样的错
内容的提问来源于stack exchange,提问作者Tristate
相关产品推荐
相关产品推荐

