使用 nginx 重定向到 docker 注册表

Jus*_*ony 5 reverse-proxy nginx docker nginx-reverse-proxy

我想要做的就是控制顶部端点(用户将在其中登录和拉取图像的 MY_ENDPOINT。正在托管注册表和容器(DOCKER_SAAS),所以我需要的只是一个看似简单的重定向。具体来说,您通常会这样做:

docker login -u ... -p ... DOCKER_SAAS
docker pull DOCKER_SAAS/.../...
Run Code Online (Sandbox Code Playgroud)

我想允许:

docker login -u ... -p ... MY_ENDPOINT
docker pull MY_ENDPOINT/.../...
Run Code Online (Sandbox Code Playgroud)

甚至更理想的是,我更喜欢:

docker login MY_ENDPOINT
docker pull MY_ENDPOINT/.../...
Run Code Online (Sandbox Code Playgroud)

最后一项的不同之处在于端点包含用户名和密码的散列版本,它被设置到一个Authorization标题中(使用Basic) - 所以用户甚至不需要担心用户名和密码,只需担心他们的 URL。我已经尝试了一个,proxy_pass因为我们已经在为基本打包(使用 HTTPS)做了,但是失败了 404(部分是因为我们不处理 /v2 - 我还需要重定向它吗?)。这让我找到了https://docs.docker.com/registry/recipes/nginx/,但这似乎只有在您托管注册表时才有意义。我正在尝试做的甚至可能吗?

ane*_*yte 1

这个简单的配置适用于 GitHub 和 Amazon ECR:

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_set_header Authorization "Basic ${NGINX_AUTH_CREDENTIALS}";
        proxy_pass https://registry.example.com;
    }
}
Run Code Online (Sandbox Code Playgroud)

${NGINX_AUTH_CREDENTIALS}是 Docker 用于身份验证的实际哈希值的占位符。$HOME/.docker/config.json使用docker login一次后即可获取:

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_set_header Authorization "Basic ${NGINX_AUTH_CREDENTIALS}";
        proxy_pass https://registry.example.com;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于代理注入/替换身份验证标头,因此无需使用docker login,只需使用代理地址而不是注册表地址进行拉取即可。

为什么是404?

40X在尝试使用以下命令测试 GitHub 代理时遇到了几个错误curl

  • 错误的凭据 - 404,而不是通常的 401 或 403。
  • GET /v2/_catalog - 404(GitHub 上尚不支持,积压中)。GET /v2/repo_name/image_name/tags/list代替使用。
  • 没有 -XGET - 405 的curl,它无论如何都会给出响应,但要获得 200,您需要显式使用 GET ( -XGET)

尽管所有这些docker pull从一开始就完美无缺,所以我建议使用它进行测试。

如何处理/v2/

location /匹配所有内容,包括/v2/,因此在代理中没有特别需要。