{"action":"created","issue":{"url":"https://api.github.com/repos/docker/distribution/issues/46","labels_url":"https://api.github.com/repos/docker/distribution/issues/46/labels{/name}","comments_url":"https://api.github.com/repos/docker/distribution/issues/46/comments","events_url":"https://api.github.com/repos/docker/distribution/issues/46/events","html_url":"https://github.com/docker/distribution/issues/46","id":53582801,"number":46,"title":"Immutable image manifest references","user":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/docker/distribution/labels/Enhancement","name":"Enhancement","color":"bfe5bf"},{"url":"https://api.github.com/repos/docker/distribution/labels/Feature","name":"Feature","color":"009800"},{"url":"https://api.github.com/repos/docker/distribution/labels/In%20Progress","name":"In Progress","color":"ededed"},{"url":"https://api.github.com/repos/docker/distribution/labels/Proposal","name":"Proposal","color":"006b75"},{"url":"https://api.github.com/repos/docker/distribution/labels/Specification","name":"Specification","color":"0052cc"},{"url":"https://api.github.com/repos/docker/distribution/labels/Urgent","name":"Urgent","color":"e11d21"}],"state":"open","locked":false,"assignee":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/docker/distribution/milestones/1","labels_url":"https://api.github.com/repos/docker/distribution/milestones/1/labels","id":917062,"number":1,"title":"Registry/Beta","description":"This milestone represents the first release of the beta version of the registry.","creator":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"open_issues":13,"closed_issues":103,"state":"open","created_at":"2014-12-29T20:35:10Z","updated_at":"2015-02-20T03:31:55Z","due_on":"2015-03-03T08:00:00Z","closed_at":null},"comments":13,"created_at":"2015-01-07T00:36:58Z","updated_at":"2015-02-20T08:30:14Z","closed_at":null,"body":"After discussion in docker/docker#9015 and docker/docker-registry#804, its clear that we need support for immutable references to v2 image references. \r\n\r\nHere are the following conditions for support, from #804.\r\n\r\n1. For the initial version, the manifest id is controlled by the registry. The manifest id should be returned as part of the response to a manifest `PUT`, in addition to a `Location` header with the canonical URL for the manifest (ie `/v2/<name>/manifests/<tag>/<digest>`).\r\n2. The \"digest\" of the manifest is the sha256 of the \"unsigned\" portion of manifest, with sorted object keys. The id is only calculated by the registry. This is dependent on #25, allowing us to merge signatures from separate pushes of identical content.\r\n3. `PUT` operations on the manifest are no longer destructive. If the content is different, the \"tag\" is updated to point at the new content. All revisions remain addressable by digest. Conflicting signatures are stored separately.\r\n4. The `DELETE` method on `/v2/<name>/manifests/<tag>` should be clarified to delete all revisions of a given tag, whereas `DELETE` on `/v2/<name>/manifests/<tag>/<digest>` should only delete the revision with the request digest.\r\n\r\nThe following are the tasks required to accomplish this:\r\n\r\n- [ ] API Specification must be updated with the following endpoints:\r\n\r\n|Method|Path|Entity|Description|\r\n-------|----|------|------------\r\n| GET | `/v2/<name>/manifests/<tag>/<digest>` | Manifest | Fetch the manifest identified by `name`, `tag` and `digest`. |\r\n| DELETE | `/v2/<name>/manifests/<tag>/<digest>` | Manifest | Delete the manifest identified by `name`, `tag` and `digest` |\r\n\r\n- [ ] Add a header to `/v2/<name>/manifests/<tag>` that includes the manifest id.\r\n- [ ] Registry implementation must support new API methods that qualify reference with id and backend must store revisions.\r\n- [ ] Registry client PR needs to updated with support for pulling qualified image references in the following format:\r\n\r\n```\r\ndocker pull <image>:<tag>@<id>\r\n```\r\n\r\n<!---\r\n@huboard:{\"order\":9.5,\"milestone_order\":46,\"custom_state\":\"\"}\n-->\r\n"},"comment":{"url":"https://api.github.com/repos/docker/distribution/issues/comments/75204781","html_url":"https://github.com/docker/distribution/issues/46#issuecomment-75204781","issue_url":"https://api.github.com/repos/docker/distribution/issues/46","id":75204781,"user":{"login":"miminar","id":1478803,"avatar_url":"https://avatars.githubusercontent.com/u/1478803?v=3","gravatar_id":"","url":"https://api.github.com/users/miminar","html_url":"https://github.com/miminar","followers_url":"https://api.github.com/users/miminar/followers","following_url":"https://api.github.com/users/miminar/following{/other_user}","gists_url":"https://api.github.com/users/miminar/gists{/gist_id}","starred_url":"https://api.github.com/users/miminar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/miminar/subscriptions","organizations_url":"https://api.github.com/users/miminar/orgs","repos_url":"https://api.github.com/users/miminar/repos","events_url":"https://api.github.com/users/miminar/events{/privacy}","received_events_url":"https://api.github.com/users/miminar/received_events","type":"User","site_admin":false},"created_at":"2015-02-20T08:30:14Z","updated_at":"2015-02-20T08:30:14Z","body":"@stevvooe Is there a way to list manifest digests similar to `GET /v2/<name>/tags/list`?"}}