{"id":18640204,"url":"https://github.com/dmage/boater","last_synced_at":"2026-01-23T16:05:15.100Z","repository":{"id":22140733,"uuid":"94233990","full_name":"dmage/boater","owner":"dmage","description":"A Docker Registry HTTP API client","archived":false,"fork":false,"pushed_at":"2024-02-29T22:44:13.000Z","size":3122,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T11:13:42.406Z","etag":null,"topics":["client","docker-registry"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmage.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-13T16:29:18.000Z","updated_at":"2022-02-17T10:19:33.000Z","dependencies_parsed_at":"2024-02-29T23:44:24.049Z","dependency_job_id":null,"html_url":"https://github.com/dmage/boater","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmage%2Fboater","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmage%2Fboater/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmage%2Fboater/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmage%2Fboater/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmage","download_url":"https://codeload.github.com/dmage/boater/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223466445,"owners_count":17149770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client","docker-registry"],"created_at":"2024-11-07T05:53:40.237Z","updated_at":"2026-01-23T16:05:10.077Z","avatar_url":"https://github.com/dmage.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Boater\n\nA Docker Registry HTTP API client.\n\n# Installation\n\n```\ngo get -u github.com/dmage/boater\n```\n\n# Usage\n\n## Get an image manifest\n\n```console\n$ boater get-manifest -a ubuntu | head -c120\n{\"manifests\":[{\"digest\":\"sha256:1d7b639619bdca2d008eca2d5293e3c43ff84cbee597ff76de3b7a7de3e84956\",\"mediaType\":\"applicati\n```\n\n## Mimic a client that supports only schema 2 manifests\n\n```console\n$ boater get-manifest ubuntu --accept-schema2\n{\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 3352,\n      \"digest\": \"sha256:d70eaf7277eada08fca944de400e7e4dd97b1262c06ed2b1011500caa4decaf1\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 28558714,\n         \"digest\": \"sha256:6a5697faee43339ef8e33e3839060252392ad99325a48f7c9d7e93c22db4d4cf\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 847,\n         \"digest\": \"sha256:ba13d3bc422b493440f97a8f148d245e1999cb616cb05876edc3ef29e79852f2\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 162,\n         \"digest\": \"sha256:a254829d9e55168306fd80a49e02eb015551facee9c444d9dce3b26d19238b82\"\n      }\n   ]\n}\n```\n\n## Get an image blob\n\n```console\n$ boater get-blob ubuntu sha256:7b9b13f7b9c086adfb6be4d2d264f90f16b4d1d5b3ab9f955caa728c3675c8a2 | head -c120\n{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"abff9e7e2995\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\"\n```\n\n## View all HTTP requests\n\n```console\n$ boater get-manifest ubuntu -v 2\u003e\u00261 | grep HTTP\n2017/06/14 00:32:10 \u003e GET https://index.docker.io/v2/ HTTP/1.1\n2017/06/14 00:32:11 \u003c HTTP/1.1 401 Unauthorized\n2017/06/14 00:32:11 \u003e GET https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull\u0026service=registry.docker.io HTTP/1.1\n2017/06/14 00:32:11 \u003c HTTP/1.1 200 OK\n2017/06/14 00:32:11 \u003e GET https://index.docker.io/v2/library/ubuntu/manifests/latest HTTP/1.1\n2017/06/14 00:32:12 \u003c HTTP/1.1 200 OK\n```\n\n## Copy a schema 2 image from one repository to another\n\n```console\n$ mkdir -p ./ubuntu/blobs\n$ boater get-manifest ubuntu --accept-schema2 \u003e./ubuntu/manifest\n$ for digest in $(jq -r '.config.digest, .layers[].digest' ./ubuntu/manifest); do\n\u003e     boater get-blob ubuntu \"$digest\" \u003e\"./ubuntu/blobs/$digest\"\n\u003e done\n$ tree ./ubuntu\n./ubuntu\n|-- blobs\n|   |-- sha256:1f88dc826b144c661a8d1d08561e1ff3711f527042955505e9f3e563bdb2281f\n|   |-- sha256:2b61829b0db5f4033ff48cbf3495271c8410c76e6396b56f15a79c3f7b5b7845\n|   |-- sha256:6960dc1aba1816652969986284410927a5d942bf8042e077a3ebc8d1c58bb432\n|   |-- sha256:73b3859b1e43f3ff32f10055951a568a9ad5ab6dc4ab61818b117b6912088f3d\n|   |-- sha256:7b9b13f7b9c086adfb6be4d2d264f90f16b4d1d5b3ab9f955caa728c3675c8a2\n|   `-- sha256:bd97b43c27e332fc4e00edf827bbc26369ad375187ce6eee91c616ad275884b1\n`-- manifest\n\n1 directory, 7 files\n```\n\n```console\nREPO=my/repo USER=user PASSWORD=password\nfor file in ./ubuntu/blobs/*; do\n    boater put-blob -u \"$USER\" -p \"$PASSWORD\" \"$REPO\" \"$file\"\ndone\nboater put-manifest -u \"$USER\" -p \"$PASSWORD\" \"$REPO\" ./ubuntu/manifest \\\n    --content-type=\"application/vnd.docker.distribution.manifest.v2+json\"\n```\n\n### Alternatives\n\n  * [reg](https://github.com/genuinetools/reg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmage%2Fboater","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmage%2Fboater","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmage%2Fboater/lists"}