Skip to content

Commit fde1798

Browse files
committed
Co-authored-by: Brandon Mitchell <git@bmitch.net>
Signed-off-by: Jeff <jscarter3@gmail.com> Update spec language to support issue #591, pushing multiple tags at once. Also can be used when pushing tags for a non-canonical algorithm (sha-512, blake3) Signed-off-by: Jeff Carter <jeff.carter@docker.com>
1 parent 6bc8715 commit fde1798

1 file changed

Lines changed: 35 additions & 18 deletions

File tree

spec.md

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,22 @@ The `<location>` is a pullable manifest URL.
472472
The Docker-Content-Digest header returns the canonical digest of the uploaded blob, and MUST be equal to the client provided digest.
473473
Clients MAY ignore the value but if it is used, the client SHOULD verify the value against the uploaded blob data.
474474

475+
When pushing a manifest by digest, the registry MAY support the pushing of tags specified by addition of `tag` query parameters.
476+
If a registry supports this, it:
477+
478+
1. MUST support pushing 5 times at once, and SHOULD NOT set an upper limit
479+
1. For each tag that was successfully pushed, include an `OCI-Tag` response header in accordance with [RFC 2616 (section 4.2)](https://datatracker.ietf.org/doc/html/rfc2616#section-4.2) semantics.
480+
481+
For example, if the client pushed a manifest with the following tags:
482+
```
483+
PUT /v2/<name>/manifests/<digest>?tag=1.2.3&tag=1.2&tag=1&tag=latest
484+
```
485+
486+
The server would respond with the following header:
487+
```
488+
OCI-Tag: 1.2.3, 1.2, 1, latest
489+
```
490+
475491
An attempt to pull a nonexistent repository MUST return response code `404 Not Found`.
476492

477493
A registry SHOULD enforce some limit on the maximum manifest size that it can accept.
@@ -728,24 +744,25 @@ This endpoint MAY be used for authentication/authorization purposes, but this is
728744

729745
#### Endpoints
730746

731-
| ID | Method | API Endpoint | Success | Failure |
732-
| ------- | -------------- | -------------------------------------------------------------- | ----------- | ----------------- |
733-
| end-1 | `GET` | `/v2/` | `200` | `404`/`401` |
734-
| end-2 | `GET` / `HEAD` | `/v2/<name>/blobs/<digest>` | `200` | `404` |
735-
| end-3 | `GET` / `HEAD` | `/v2/<name>/manifests/<reference>` | `200` | `404` |
736-
| end-4a | `POST` | `/v2/<name>/blobs/uploads/` | `202` | `404` |
737-
| end-4b | `POST` | `/v2/<name>/blobs/uploads/?digest=<digest>` | `201`/`202` | `404`/`400` |
738-
| end-5 | `PATCH` | `/v2/<name>/blobs/uploads/<reference>` | `202` | `404`/`416` |
739-
| end-6 | `PUT` | `/v2/<name>/blobs/uploads/<reference>?digest=<digest>` | `201` | `404`/`400` |
740-
| end-7 | `PUT` | `/v2/<name>/manifests/<reference>` | `201` | `404` |
741-
| end-8a | `GET` | `/v2/<name>/tags/list` | `200` | `404` |
742-
| end-8b | `GET` | `/v2/<name>/tags/list?n=<integer>&last=<integer>` | `200` | `404` |
743-
| end-9 | `DELETE` | `/v2/<name>/manifests/<reference>` | `202` | `404`/`400`/`405` |
744-
| end-10 | `DELETE` | `/v2/<name>/blobs/<digest>` | `202` | `404`/`405` |
745-
| end-11 | `POST` | `/v2/<name>/blobs/uploads/?mount=<digest>&from=<other_name>` | `201` | `404` |
746-
| end-12a | `GET` | `/v2/<name>/referrers/<digest>` | `200` | `404`/`400` |
747-
| end-12b | `GET` | `/v2/<name>/referrers/<digest>?artifactType=<artifactType>` | `200` | `404`/`400` |
748-
| end-13 | `GET` | `/v2/<name>/blobs/uploads/<reference>` | `204` | `404` |
747+
| ID | Method | API Endpoint | Success | Failure |
748+
|---------|----------------|--------------------------------------------------------------|-------------|-------------------|
749+
| end-1 | `GET` | `/v2/` | `200` | `404`/`401` |
750+
| end-2 | `GET` / `HEAD` | `/v2/<name>/blobs/<digest>` | `200` | `404` |
751+
| end-3 | `GET` / `HEAD` | `/v2/<name>/manifests/<reference>` | `200` | `404` |
752+
| end-4a | `POST` | `/v2/<name>/blobs/uploads/` | `202` | `404` |
753+
| end-4b | `POST` | `/v2/<name>/blobs/uploads/?digest=<digest>` | `201`/`202` | `404`/`400` |
754+
| end-5 | `PATCH` | `/v2/<name>/blobs/uploads/<reference>` | `202` | `404`/`416` |
755+
| end-6 | `PUT` | `/v2/<name>/blobs/uploads/<reference>?digest=<digest>` | `201` | `404`/`400` |
756+
| end-7a | `PUT` | `/v2/<name>/manifests/<reference>` | `201` | `404` |
757+
| end-7b | `PUT` | `/v2/<name>/manifests/<digest>?tag=1&tag=2&tag=3` | `201` | `404` |
758+
| end-8a | `GET` | `/v2/<name>/tags/list` | `200` | `404` |
759+
| end-8b | `GET` | `/v2/<name>/tags/list?n=<integer>&last=<integer>` | `200` | `404` |
760+
| end-9 | `DELETE` | `/v2/<name>/manifests/<reference>` | `202` | `404`/`400`/`405` |
761+
| end-10 | `DELETE` | `/v2/<name>/blobs/<digest>` | `202` | `404`/`405` |
762+
| end-11 | `POST` | `/v2/<name>/blobs/uploads/?mount=<digest>&from=<other_name>` | `201` | `404` |
763+
| end-12a | `GET` | `/v2/<name>/referrers/<digest>` | `200` | `404`/`400` |
764+
| end-12b | `GET` | `/v2/<name>/referrers/<digest>?artifactType=<artifactType>` | `200` | `404`/`400` |
765+
| end-13 | `GET` | `/v2/<name>/blobs/uploads/<reference>` | `204` | `404` |
749766

750767
#### Error Codes
751768

0 commit comments

Comments
 (0)