Docker推送镜像到私有Registry时认证失败怎么办?
我在本地搭了个私有Docker Registry,用docker push的时候一直报“unauthorized: authentication required”,明明已经用docker login登录过了,配置也加了insecure-registries,但还是不行,到底哪里出问题了?
我的Registry是通过以下HTML页面做简单测试入口的(虽然和问题可能无关,但贴出来以防万一):
<html>
<head><title>My Registry</title></head>
<body>
<h1>Private Docker Registry</h1>
<p>Status: Running on port 5000</p>
</body>
</html>
你可以先检查一下本地的凭据存储文件。打开
~/.docker/config.json看一眼,auths下面存的那个key,是不是跟你docker push时用的镜像地址完全一致。比如你登录的时候用的是
docker login localhost:5000,那config.json里存的key就是localhost:5000。这时候如果你给镜像打tag用的是127.0.0.1:5000/my-image,Docker去config.json里找127.0.0.1:5000的认证信息,发现找不到,就直接以未认证身份去推,结果自然就被Registry拒绝了。解决办法很简单,统一地址。
第一步,确认你Registry的访问地址,比如是
192.168.1.100:5000。第二步,重新登录,确保带上端口:
第三步,打tag的时候必须用同样的地址:
另外提一句,你配置了
insecure-registries之后,必须重启Docker服务才能生效,光改配置文件不重启是没用的。如果上面这招还不行,那就要看看你的Registry是不是配置了认证但后端服务有问题,不过大概率就是地址没对上。那个HTML页面大概率只是个静态欢迎页,跟Registry API交互没关系,先放一边。