Come posso utilizzare la finestra Mobile del Registro di sistema API V2 per eliminare un’immagine da un privato del registro di sistema?

Dato un Mobile Registro Di Sistema a localhost:5000, come posso utilizzare il La finestra mobile di Registro HTTP API V2 e curl per eliminare busybox:latest che ha il seguente manifesto intestazione e il manifesto:

[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"
      }
   ]
}

Finestra mobile di Registro si lamenta dicendo “HTTP/1.1 404 Not Found” e “MANIFEST_UNKNOWN” quando si tenta di DELETE l’immagine digest:

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

 

2 Replies
  1. 20

    Si PREGA di NOTARE: Questo endpoint API è implementata solo nelle versioni successive di v2 registro di sistema!

    C’è un interno garbage collection processo che elimina le immagini nel registro di sistema, ma che non è (ancora) accessibili per via v2 API del registro di sistema. Questa caratteristica sembra che ha un sacco di recente movimento, in modo che queste informazioni potrebbero cambiare.

    Secondo l’API spec, hai avuto modo di afferrare l’immagine digerire per eseguire un’ELIMINAZIONE contro di essa. Leggi le specifiche attentamente e notare la parte riguardante la richiesta di intestazione quando si chiede per l’immagine di destra digest (“Nota Quando si elimina un manifesto da un registro di sistema versione 2.3 o versioni successive, la seguente intestazione deve essere utilizzato quando la TESTA o ing il manifesto di ottenere la corretta digerire per eliminare: Accetta: application/vnd.scaricatore di porto.di distribuzione.manifesto.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
    

    Quando lo si fa, si sta andando ad essere prestando particolare attenzione alla Docker-Content-Digest intestazione. Nella vostra richiesta particolare, che l’intestazione completa assomiglia a questo:

    Docker-Content-Digest: sha256:e45f25b1760f616e65f106b424f4ef29185fbd80822255d79dabc73b8eb715ad
    

    Ora con digest si dovrebbe essere in grado di collegare in formato descritto da le API è collegata:

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

    E per utilizzare l’esempio che ho usato in precedenza, ma con il digest, il ricciolo di simile a questo:

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

    Allora si dovrebbe ottenere un 202 Accepted codice di risposta che indica l’eliminazione di successo.

    Puoi anche provare breve script da questo 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' \
    )"
    
    • Perché è necessario specificare il nome utente nell’URL?
    • Ho aggiunto alla mia domanda un esempio di un tentativo non riuscito di DELETE un’immagine. Supponendo che ho specificato correttamente la richiesta, io sono perplesso perché la finestra Mobile del Registro di sistema non riesce a trovare l’immagine ha dato digerire.
    • Sono assolutamente certo che il tuo busybox immagine non includere un utente dello spazio dei nomi, come nel mio esempio? Ero solo in grado di farlo funzionare, specificando il nome completo dell’immagine, tra cui il “repo” (nome utente), ad esempio https://reg.foo.com/v2/l0j1k/busybox/manifests/sha:deadbeefbabecafe. Solo a quel punto sono stato in grado di ottenere qualcosa di diverso da un 404. Inoltre, assicurarsi che si sta utilizzando una buona Distribuzione del numero di versione, ad esempio, almeno il Registro di sistema v2.4.
    • Come mia domanda mostra, il GET richiesta può trovare l’immagine e i rapporti di suo digerire, ma il DELETE richiesta ha esito negativo.
    • Come posso query il numero di versione del registro di sistema? Ho tirato molto di recente.
    • Non Registro di richiedono, l’immagine appartiene ad un utente spazio dei nomi? Mobile può tirare il busybox immagine dal mio registro di sistema, quindi la mia ipotesi è che un utente spazio dei nomi non è necessario.
    • Non riuscivo a eliminare dal mio registro di sistema senza specificare l’utente/repo parte del nome dell’immagine. Che mi permette di query il manifesto, ecc, ma non mi ha permesso di eliminare fino a quando ero a condizione che. Io non sono sicuro se è necessario, e non è nemmeno menzionato nell’API, ma è così che ha funzionato per me.
    • Davvero credo che la Distribuzione gente cadere la palla su questo API. Non è trasparente.
    • Anche se siete solo in cerca di sbarazzarsi di vecchie immagini, c’è una procedura di garbage collection utilità ora disponibile nelle versioni più recenti del registro di sistema. Io non sono in grado di determinare la versione del registro di sistema da soli e l’esecuzione di query sue API, quindi non credo che sia possibile, ma ancora una volta, non è sicuro. Che il GC utilità ha generato un sacco di discussione su GH e possono servire i vostri scopi di meglio di questo elimina business, ma non posso aiutarvi con più di dirvi su di esso, perché non l’ho mai usato, solo sentito parlare.
    • È necessario specificare il Accettare, l’intestazione del CAPO di richiesta correttamente. Appena modificato la risposta a riflettere.
    • Ho fatto quello che hai consigliato, ma non ha funzionato per me, per ulteriori dettagli stackoverflow.com/q/39918794/6638204
    • Risposta lavorato per me. Naturalmente, se si desidera recuperare lo spazio su disco è necessario eseguire la procedura di garbage collection. Detto questo, questa API puzza. Perché abbiamo bisogno che ID extra (c’è già un paio di manifesti)?

Lascia un commento