2016-05-04 17 views
8

Cho một Docker Registry tại localhost:5000, làm thế nào tôi có thể sử dụng Docker Registry HTTP API V2curl xóa busybox:latest có tiêu đề biểu hiện sau đây và biểu hiện:Tôi làm cách nào để sử dụng Docker Registry API V2 để xóa hình ảnh khỏi một đăng ký riêng tư?

[email protected]:~/Projects/docker-registry$ curl --head --request GET http://localhost:5000/v2/busybox/manifests/latest 
HTTP/1.1 200 OK 
Content-Length: 2561 
Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws 
Docker-Content-Digest: sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad 
Docker-Distribution-Api-Version: registry/2.0 
Etag: "sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad" 
X-Content-Type-Options: nosniff 
Date: Wed, 04 May 2016 16:10:00 GMT 

[email protected]:~/Projects/docker-registry$ curl --request GET http://localhost:5000/v2/busybox/manifests/latest 
{ 
    "schemaVersion": 1, 
    "name": "busybox", 
    "tag": "latest", 
    "architecture": "amd64", 
    "fsLayers": [ 
     { 
     "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" 
     }, 
     { 
     "blobSum": "sha256:385e281300cc6d88bdd155e0931fbdfbb1801c2b0265340a40481ee2b733ae66" 
     } 
    ], 
    "history": [ 
     { 
     "v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"156e10b83429\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"sh\"],\"Image\":\"56ed16bd6310cca65920c653a9bb22de6b235990dcaa1742ff839867aed730e5\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"container\":\"5f8098ec29947b5bea80483cd3275008911ce87438fed628e34ec0c522665510\",\"container_config\":{\"Hostname\":\"156e10b83429\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [\\\"sh\\\"]\"],\"Image\":\"56ed16bd6310cca65920c653a9bb22de6b235990dcaa1742ff839867aed730e5\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":{}},\"created\":\"2016-03-18T18:22:48.810791943Z\",\"docker_version\":\"1.9.1\",\"id\":\"437595becdebaaaf3a4fc3db02c59a980f955dee825c153308c670610bb694e1\",\"os\":\"linux\",\"parent\":\"920777304d1d5e337bc59877253e946f224df5aae64c72538672eb74637b3c9e\"}" 
     }, 
     { 
     "v1Compatibility": "{\"id\":\"920777304d1d5e337bc59877253e946f224df5aae64c72538672eb74637b3c9e\",\"created\":\"2016-03-18T18:22:48.262403239Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -C#(nop) ADD file:47ca6e777c36a4cfffe3f918b64a445c8f32300deeb9dfa5cc47261bd7b75d21 in /\"]}}" 
     } 
    ], 
    "signatures": [ 
     { 
     "header": { 
      "jwk": { 
       "crv": "P-256", 
       "kid": "RVEO:MXL3:ZYLW:BFGB:QAKI:SIKZ:JOVR:U7AP:2LGY:4SSF:MSV4:LND7", 
       "kty": "EC", 
       "x": "ZFyhNUInMwlVmFKzz-e-o_tzMd01ZdCj6LyGV4dnT5Y", 
       "y": "3a0BcWa0h60tTGHYhUI4ziKisRk6b4JtvqbmL9kKy6E" 
      }, 
      "alg": "ES256" 
     }, 
     "signature": "BVWioJafWmMrUBBi9meRy9CUQYdsZgwkY01ipT1HInXofVXCIZmNMq7EFEl4A88pMZsf7DHZS2dyFeFjj-QP1Q", 
     "protected": "eyJmb3JtYXRMZW5ndGgiOjE5MTQsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNi0wNS0wNFQxNjoxMzo0M1oifQ" 
     } 
    ] 
} 

Docker Registry phàn nàn với "HTTP/1.1 404 Not Found" và "MANIFEST_UNKNOWN "khi tôi cố gắng để DELETE hình ảnh tiêu hóa:

[email protected]:~/Projects/docker-registry$ curl --request DELETE http://localhost:5000/v2/busybox/manifests/sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad 
{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown"}]} 

Trả lời

14

XIN LƯU Ý: endpoint API này chỉ được thực hiện trong các phiên bản sau này của registry v2!

Có một quy trình nội bộ garbage collection xóa hình ảnh trong sổ đăng ký nhưng chưa được truy cập qua API đăng ký v2. Tính năng này có vẻ như nó có rất nhiều chuyển động gần đây, vì vậy thông tin này có thể thay đổi.

Theo thông số API, bạn phải lấy thông báo hình ảnh để chạy DELETE chống lại nó. Đọc kỹ thông số kỹ thuật và chú ý đến phần tiêu đề cần thiết khi yêu cầu thông báo đúng hình ảnh ("Lưu ý Khi xóa một tệp kê khai từ phiên bản đăng ký 2.3 trở lên, tiêu đề sau phải được sử dụng khi HEAD hoặc GET tệp kê khai để lấy đúng tiêu hóa để xóa: Chấp nhận: application/vnd.docker.distribution.manifest.v2 + json ")

curl -v -u "[email protected]:passw0rd" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X HEAD https://registry.example.com/v2/derek/busybox/manifests/latest 

Khi bạn làm điều đó, bạn sẽ được đặc biệt chú ý đến Docker-Content-Digest tiêu đề. Trong yêu cầu cụ thể của bạn, mà Tiêu đề đầy đủ trông như thế này:

Docker-Content-Digest: sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad 

Bây giờ với tiêu hóa bạn sẽ có thể cắm nó vào dạng được mô tả bởi the API bạn liên kết:

DELETE /v2/<name>/manifests/<reference> 

Và để sử dụng Ví dụ: tôi đã sử dụng ở trên, nhưng với tiêu hóa của bạn, curl trông như thế này:

curl -u "[email protected]:passw0rd" -X DELETE https://registry.example.com/v2/derek/busybox/manifests/sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad 

Sau đó, bạn sẽ nhận được một mã số 202 Accepted phản ứng cho thấy thành công del etion.

Bạn cũng có thể thử các kịch bản ngắn từ this gist:

registry='localhost:5000' 
name='my-image' 
curl -v -sSL -X DELETE "http://${registry}/v2/${name}/manifests/$(
    curl -sSL -I \ 
     -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ 
     "http://${registry}/v2/${name}/manifests/$(
      curl -sSL "http://${registry}/v2/${name}/tags/list" | jq -r '.tags[0]' 
     )" \ 
    | awk '$1 == "Docker-Content-Digest:" { print $2 }' \ 
    | tr -d $'\r' \ 
)" 
+0

Tại sao tôi phải chỉ định tên người dùng của tôi trong URL? –

+0

Tôi đã thêm vào câu hỏi của mình một ví dụ về một nỗ lực không thành công đối với 'DELETE' một hình ảnh. Giả sử rằng tôi đã chỉ định yêu cầu một cách chính xác, tôi bối rối vì sao Docker Registry không thể tìm thấy hình ảnh có thông báo đã cho. –

+0

Bạn có chắc chắn rằng hình ảnh 'busybox' của bạn không bao gồm một vùng tên người dùng ở đó, như trong ví dụ của tôi? Tôi chỉ có thể làm cho nó hoạt động bằng cách chỉ định tên đầy đủ của hình ảnh, bao gồm cả "repo" (tên người dùng), ví dụ: 'https: //reg.foo.com/v2/l0j1k/busybox/manifests/sha: deadbeefbabecafe'. Chỉ vào thời điểm đó tôi mới có thể nhận được bất kỳ thứ gì ngoài 404. Ngoài ra, hãy đảm bảo bạn đang sử dụng số phiên bản Phân phối đủ cao, ví dụ: ít nhất là Registry v2.4. – L0j1k

Các vấn đề liên quan