501推送到Artifactory Docker存储库时未实现

时间:2015-10-30 08:50:38

标签: nginx docker artifactory

我将Artifactory设置为Docker存储库。我按照文档,我能够成功从我的虚拟Docker仓库中提取图像。

但是,当我尝试将映像推送到本地存储库时,它会因501 Not Implemented错误而失败。

这是我的设置:

Nginx是反向代理:

artifactory.somedomain.com:8085 -> http://localhost:8081/artifactory/api/docker/docker-local/v2
artifactory.somedomain.com:8086 -> http://localhost:8081/artifactory/api/docker/docker/v2
  • docker-local是本地存储库,API V2,不强制进行身份验证。没有其他设置。
  • docker是一个虚拟存储库,聚合docker-local和docker-remote(它只代表std Docker repo)

命令运行

docker pull artifactory.somedomain.com:8086/busybox:latest 
docker tag artifactory.somedomain.com:8086/busybox artifactory.somedomain.com:8085/busybox 
docker push artifactory.somedomain.com:8085/busybox 

结果:

The push refers to a repository [artifactory.somedomain.com:8085/busybox] (len: 1) 
2c5ac3f849df: Buffering to Disk 
Received unexpected HTTP status: 501 Not Implemented 

任何想法都可能出错? 谢谢!

nginx.conf (前两个规则通常处理重定向http,后两个规则处理Docker存储库的代理)

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    client_max_body_size 1G;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

        server {
                listen 80;
                server_name artifactory.somedomain.com;
                return 301 https://$server_name$request_uri;
        }

        server {
            listen 443;
            server_name artifactory.somedomain.com;

            access_log /var/log/nginx/artifactory.yourdomain.com.access.log;
            error_log /var/log/nginx/artifactory.yourdomain.com.error.log;

            ssl on;
            ssl_certificate /etc/nginx/cert/artifactory-cert-chain.crt;
            ssl_certificate_key /etc/nginx/cert/artifactory.key;

            ssl_session_timeout 5m;

            ssl_protocols SSLv3 TLSv1;
            ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
            ssl_prefer_server_ciphers on;

            location / {
                proxy_redirect http:// https://;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Ssl on;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_pass http://localhost:8081;
                proxy_pass_header Server;
                proxy_read_timeout 90;
            }
        }

        server {
            listen 8085;
            server_name artifactory.somedomain.com;

            ssl on;
            ssl_certificate /etc/nginx/cert/artifactory-cert-chain.crt;
            ssl_certificate_key /etc/nginx/cert/artifactory.key;

            access_log /var/log/nginx/artprod.company.com.access.log;
            error_log /var/log/nginx/artprod.company.com.error.log;

            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Original-URI $request_uri;
            proxy_pass_header   Server;  # To help debugging, list the server that actually did the reply rather than nginx
            proxy_read_timeout 900;

            client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

            # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
            chunked_transfer_encoding on;

            location /v2 {
                # Do not allow connections from docker 1.5 and earlier
                # docker pre-1.6.0 did not properly set the user agent on ping
                if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))).*$" ) {
                   return 404;
                }

                proxy_pass http://localhost:8081/artifactory/api/docker/docker-local/v2;
        }
    }

        server {
            listen 8086;
            server_name artifactory.somedomain.com;

            ssl on;
            ssl_certificate /etc/nginx/cert/artifactory-cert-chain.crt;

            ssl_certificate_key /etc/nginx/cert/artifactory.key;

            access_log /var/log/nginx/artprod.company.com.access.log;
            error_log /var/log/nginx/artprod.company.com.error.log;

            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Original-URI $request_uri;
            proxy_pass_header   Server;  # To help debugging, list the server that actually did the reply rather than nginx
            proxy_read_timeout 900;

            client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

            # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
            chunked_transfer_encoding on;

            location /v2 {
                # Do not allow connections from docker 1.5 and earlier
                # docker pre-1.6.0 did not properly set the user agent on ping
                if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))).*$" ) {
                return 404;
                }

                proxy_pass http://localhost:8081/artifactory/api/docker/docker/v2;
        }
    }

}

NginX的访问日志会针对每个请求显示此信息

192.168.33.65 - - [02/Nov/2015:13:04:56 +0100] "GET /v2/ HTTP/1.1" 200 12 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.1.10-boot2docker os/linux arch/amd64"
192.168.33.65 - - [02/Nov/2015:13:04:57 +0100] "HEAD /v2/busybox/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 HTTP/1.1" 404 0 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.1.10-boot2docker os/linux arch/amd64"
192.168.33.65 - - [02/Nov/2015:13:04:57 +0100] "POST /v2/busybox/blobs/uploads/ HTTP/1.1" 202 0 "-" "docker/1.8.3 go/go1.4.2 git-commit/f4bf5c7 kernel/4.1.10-boot2docker os/linux arch/amd64"

1 个答案:

答案 0 :(得分:4)

问题出在NginX的配置上。 Artifactory文档中提供的示例假设您使用HTTPS端口443连接到存储库。

如果您使用的是其他端口,则需要修改<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <div class="row"> <div class="col-sm-3"> <h2>This is title</h2> <p>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci </p> </div> <div class="col-sm-9"> <img src="http://eibach.com/sites/eibach.com.m-global/files/pictures/project_cars/eibach_projektfahrzeug_vw_scirocco_1024x768_1.jpg" alt=""/> </div> </div> </div> listen指令以包含该端口。

proxy_set_header Host