当我尝试从本地镜像中提取图像时,它可以正常工作:
$ docker login -u docker -p mypassword nexus3.pleiade.mycomp.fr:5000
$ docker pull nexus3.pleiade.mycomp.fr:5000/hello-world
Using default tag: latest
latest: Pulling from **hello-world**
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for **nexus3.pleiade.mycomp.fr:5000/hello-world:latest**
但是,当我想将此注册表用作镜像时,它只是被忽略,图像总是从Web Docker集线器中提取,而不是从我的本地镜像中提取:
$ ps -ef | grep docker
/usr/bin/dockerd -H fd:// --storage-driver=overlay2 --registry-mirror=https://nexus3.pleiade.mycomp.fr:5000
$ docker info
Registry Mirrors:
https://nexus3.pleiade.mycomp.fr:5000/
$ docker rmi nexus3.pleiade.mycomp.fr:5000/hello-world
_
$ docker pull hello-world
Using default tag: latest
latest: Pulling from **library/hello-world**
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for **hello-world:latest**
我确定它不会使用我的镜像,因为当我取消设置代理设置时,它无法达到hello-world图像。
它是Docker的错误,还是我错过了什么?
Docker info(简称):
Server Version: 1.13.1
Storage Driver: overlay2
(...)
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.8.0-37-generic
Operating System: Ubuntu 16.10
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 15.67 GiB
(...)
Registry Mirrors:
https://nexus3.pleiade.edf.fr:5000/
更新:
做“journalctl -xe”,我可以看到一些有用的信息:
level=error msg="Attempting next endpoint for pull after error: Get https://nexus3.pleiade.mycomp.fr:5000/v2/library/hello-world/manifests/latest: no basic auth credentials"
它看起来与:https://github.com/docker/docker/issues/20097有关,但解决方法不起作用:当我用--registry-mirror = https://nexus3.pleiade.mycomp.fr:5000
https://docker:password@nexus3.pleiade.mycomp.fr:5000时>我得到完全相同的错误。
如果重要,nexus正在使用自签名证书,该证书已复制到/etc/docker/certs.d/nexus3.pleiade.mycomp.fr:5000/ca.crt,这允许通过“docker”登录登录”。
答案 0 :(得分:2)
这是一个码头工具错误:github.com/docker/docker/issues/30880
解决方法是设置https反向代理设置硬编码的身份验证标头。
以下是来自Felipe C.的示例配置:
在nginx docker config中,添加:
proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
完整示例:
server {
listen *:443 ssl http2;
server_name docker.domain.blah.net;
ssl on;
include ssl/domain.blah.net.conf;
# allow large uploads of files - refer to nginx documentation
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
proxy_pass http://127.0.0.1:8083/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization "Basic YWRtaW46YWRtaW4xMjM=";
#proxy_set_header X-Forwarded-Proto "https";
}
}
server {
listen *:80;
server_name docker.domain.blah.net;
return 301 https://$server_name$request_uri;
}
答案 1 :(得分:1)
另一种方法是 docker 注销其他服务器。 并启用注册表配置允许匿名docker pull(需要Docker Bearer Token Realm)。
答案 2 :(得分:0)
我可以添加/etc/docker/daemon.json:
{
"registry-mirrors": [ "nexus3.pleiade.mycomp.fr" ],
"max-concurrent-downloads": 20
}
答案 3 :(得分:0)
我可能会迟到,但我希望这对某人有所帮助。我遇到了同样的问题,并在 nexus 日志中收到了身份验证错误。
事实证明我必须在我的 nexus 存储库设置中启用匿名 docker pull
同时在安全->领域下检查 Docker Bearer Token Realm
处于活动状态并给予高优先级
答案 4 :(得分:-1)
您可以在URL中添加基本身份验证,它对我有用。像
https://username:password@nexus3.pleiade.mycomp.fr:5000