我正在尝试在Nginx代理后面建立一个私有Docker注册表,该代理对所有人都是只读的(即允许拉请求),但需要对推请求进行身份验证。我遵循了各种指南,但仍然感到困惑。下面是我当前的nginx配置:
events {
worker_connections 1024;
}
http {
upstream docker-registry {
server registry:5000;
}
## Set a variable to help us decide if we need to add the
## 'Docker-Distribution-Api-Version' header.
## The registry always sets this header.
## In the case of nginx performing auth, the header is unset
## since nginx is auth-ing before proxying.
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
'registry/2.0' '';
default registry/2.0;
}
server {
listen 80;
server_name docker-host.example.com;
location / {
rewrite ^(.*)$ https://docker-host.example.com$1 last;
}
}
server {
listen 443 ssl;
server_name docker-host.example.com;
ssl_certificate /etc/nginx/ssl/example.cert.pem;
ssl_certificate_key /etc/nginx/ssl/example.key.pem;
ssl_ciphers 'AES256+EECDH:AES256+EDH::!EECDH+aRSA+RC4:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
client_max_body_size 0;
location / {
limit_except GET HEAD OPTIONS {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/users.pwd;
}
include proxy.conf;
}
}
}
它确实允许匿名请求,但推送总是失败,并显示“未授权:需要身份验证”。如果我删除条件limit_except
,即要求对所有访问进行身份验证,则登录后即可正常工作。
当我从nginx
完全删除身份验证配置时,一切正常,但显然没有身份验证。
任何帮助或指针,将不胜感激。
答案 0 :(得分:1)
我们一直在使用https://github.com/cesanta/docker_auth,它工作得很好,您可以设置许多身份验证方法
有关更多信息,请检查
https://github.com/cesanta/docker_auth/blob/master/README.md
答案 1 :(得分:-1)
“未经授权:需要身份验证”错误来自注册表API。这意味着您已在注册表本身中启用了身份验证。要么在注册表中禁用身份验证并仅使用nginx基本身份验证,要么通过具有相关数据的代理传递“ Authorization”标头(不正确)。