How can i active DockerToken realms in nexus 3.38? I use this URL but not work and docker realms is not activated.
curl -XPUT -H "accept: application/json" -u admin:pass -d '{"id" : "DockerToken"}' http://192.168.254.10:8081/service/rest/v1/security/realms/active
Or reamls.json
[
"id": "DockerToken"
]
curl -XPUT -H "Content-Type: text/plain" -u admin:pass -d #realms.json http://192.168.254.10:8081/service/rest/v1/security/realms/
I think should help this request:
curl -XPUT -H "Content-Type: application/json" -u admin:pass --data-raw '["NexusAuthenticatingRealm", "NexusAuthorizingRealm", "DockerToken"]' http://192.168.254.10:8081/service/rest/v1/security/realms/active
I am using onfido v3.2 and I want to create SDK token. First I had create applicant using sandbox API key.
curl -X POST https://api.eu.onfido.com/v3.2/applicants/ \
-H 'Authorization: Token token=<YOUR_API_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"first_name": "Jane",
"last_name": "Doe"
}'
Then I had use applicant id from above api response for create SDK token and use same API token. https://documentation.onfido.com/#create-applicant
curl -X POST https://api.eu.onfido.com/v3.2/sdk_token \
-H 'Authorization: Token token=<YOUR_API_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"applicant_id": "<APPLICANT_ID>"
}'
I am using same API TOKEN in both api but sdk create api return error.
https://documentation.onfido.com/#generate-sdk-token
{
"error": {
"type": "authorization_error",
"message": "Authorization error: please re-check your credentials",
"fields": {}
}
}
I don't understand what going wrong here? Thank you in advance.
I'm trying to use the Bitbucket Server RST API to create a new tag for a specific commit (represented by a hash). Please note that I use basic auth but don't write it to my examples below. What I've got is an HTTP 500 response.
curl -XPOST 'http://<server>/rest/api/latest/projects/p1/repos/r1/tags' -d '{
"name": "my-new-tag",
"hash": "0d2019c8e18f8c961cdb67cb27afb69b04f3a10b"
}'
I also tried:
curl -XPOST 'http://<server>/2.0/repositories/username/r1/refs/tags' -d '{
"name": "my-new-tag",
"hash": "0d2019c8e18f8c961cdb67cb27afb69b04f3a10b"
}'
But in this case the request ends up in an HTTP 404 and I think that's because this is not a Bitbucket Server URL.
You can try this way:
curl -X POST -k -H 'Content-Type: application/json' -s -u <Your Account>:<Your password> -i 'https://api.bitbucket.org/2.0/repositories/username/r1/refs/tags' --data '{
"name": "my-new-tag",
"target":{
"hash": "0d2019c8e18f8c961cdb67cb27afb69b04f3a10b"
}
}'
or
curl -X POST -k -H 'Content-Type: application/json' Authorization: Basic <<Authentication String>>' -i 'https://api.bitbucket.org/2.0/repositories/username/r1/refs/tags' --data '{
"name": "my-new-tag",
"target":{
"hash": "0d2019c8e18f8c961cdb67cb27afb69b04f3a10b"
}
}'
Hi, I'm trying to upload a docker container to a private docker registry using the API.
Using docker command everything seems to works just fine:
docker pull ubuntu:16.04
docker tag ubuntu:16.04 <PRIVATE-REGISTRY-IP>:5000/ubuntu/16.04
docker push <PRIVATE-REGISTRY-IP>:5000/ubuntu/16.04
I'm trying to upload the same image using the API, what I've done:
export the container using docker save ubuntu:16.04 -o ubuntu.tar
untar the container file tar xf ubuntu.tar
upload all the layers with curl
upload manifest with curl
Ok, reading the doc, the layers must be PUT separatedly each one with their digest obtained using sha256sum <LAYER-FILE> and after it's done, manifest should be also PUT onto registry
curl call details :)
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["318d5752-b10b-49da-9ebf-5891b679a805"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:53 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/318d5752-b10b-49da-9ebf-5891b679a805?_state\u003dv2nk-ATsPGQKJatyjUQTSJwl2BlQywrqeCkVTzQj0uh7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiMzE4ZDU3NTItYjEwYi00OWRhLTllYmYtNTg5MWI2NzlhODA1IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjE1Njk5NzUxM1oifQ%3D%3D"]}
DIGEST=$(sha256sum /home/user/container/ubuntu/3e1722599d1d5331b610200b6b41f895759e312ff1f14e009bee2f52f962b69f/layer.tar)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/3e1722599d1d5331b610200b6b41f895759e312ff1f14e009bee2f52f962b69f/layer.tar http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/318d5752-b10b-49da-9ebf-5891b679a805?_state=v2nk-ATsPGQKJatyjUQTSJwl2BlQywrqeCkVTzQj0uh7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiMzE4ZDU3NTItYjEwYi00OWRhLTllYmYtNTg5MWI2NzlhODA1IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjE1Njk5NzUxM1oifQ%3D%3D&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:53 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:bf6751561805be7d07d66f6acb2a33e99cf0cc0a20f5fd5d94a3c7f8ae55c2a1"],"Docker-Content-Digest":["sha256:bf6751561805be7d07d66f6acb2a33e99cf0cc0a20f5fd5d94a3c7f8ae55c2a1"]}
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["7680a9d6-7686-49a6-a6fa-44979370c2ec"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:53 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/7680a9d6-7686-49a6-a6fa-44979370c2ec?_state\u003duyI8QOIktlkc_9qynIKOXJC0FaVT6YQPlpRGfwNXHgV7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiNzY4MGE5ZDYtNzY4Ni00OWE2LWE2ZmEtNDQ5NzkzNzBjMmVjIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjU3NDc3ODk3OVoifQ%3D%3D"]}
code: $1
body:$2
DIGEST=$(sha256sum /home/user/container/ubuntu/6f12534822c57808e10e079842da48607c40eeb82048541320ba454af83cf021/layer.tar)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/6f12534822c57808e10e079842da48607c40eeb82048541320ba454af83cf021/layer.tar http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/7680a9d6-7686-49a6-a6fa-44979370c2ec?_state=uyI8QOIktlkc_9qynIKOXJC0FaVT6YQPlpRGfwNXHgV7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiNzY4MGE5ZDYtNzY4Ni00OWE2LWE2ZmEtNDQ5NzkzNzBjMmVjIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjU3NDc3ODk3OVoifQ%3D%3D&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:53 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:943edb549a8300092a714190dfe633341c0ffb483784c4fdfe884b9019f6a0b4"],"Docker-Content-Digest":["sha256:943edb549a8300092a714190dfe633341c0ffb483784c4fdfe884b9019f6a0b4"]}
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["8b7245b4-9f42-42e6-8512-6b645ac233a0"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:54 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/8b7245b4-9f42-42e6-8512-6b645ac233a0?_state\u003dg5hAehwCOPnnMhfUC-Ugu_-lX9pp5NgJdTjB7cp0hO57Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiOGI3MjQ1YjQtOWY0Mi00MmU2LTg1MTItNmI2NDVhYzIzM2EwIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjk4NDA1OTE4N1oifQ%3D%3D"]}
code: $1
body:$2
DIGEST=$(sha256sum /home/user/container/ubuntu/23a78ada034808b66348c42b9bb941901651b533b445cfb94e6b7646d2e2110d/layer.tar)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/23a78ada034808b66348c42b9bb941901651b533b445cfb94e6b7646d2e2110d/layer.tar http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/8b7245b4-9f42-42e6-8512-6b645ac233a0?_state=g5hAehwCOPnnMhfUC-Ugu_-lX9pp5NgJdTjB7cp0hO57Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiOGI3MjQ1YjQtOWY0Mi00MmU2LTg1MTItNmI2NDVhYzIzM2EwIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjUzLjk4NDA1OTE4N1oifQ%3D%3D&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:54 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:c1bd37d01c89de343d68867518b1155cb297d8e03942066ecb44ae8f46b608a3"],"Docker-Content-Digest":["sha256:c1bd37d01c89de343d68867518b1155cb297d8e03942066ecb44ae8f46b608a3"]}
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["8d97ab31-5801-4bdd-bdfd-a4878b9e7317"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:05:55 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/8d97ab31-5801-4bdd-bdfd-a4878b9e7317?_state\u003d0NkM--lD5vDA_wlPiPd1dEs-7WwDSmb_UfGJmMDAsIR7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiOGQ5N2FiMzEtNTgwMS00YmRkLWJkZmQtYTQ4NzhiOWU3MzE3IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjU1LjE5MDY1NDkzWiJ9"]}
code: $1
body:$2
DIGEST=$(sha256sum /home/user/container/ubuntu/a940c634b64a460f47e4c5d6f51e49c28280eb9e0e3da24df76b00c8c60ba756/layer.tar)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/a940c634b64a460f47e4c5d6f51e49c28280eb9e0e3da24df76b00c8c60ba756/layer.tar http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/8d97ab31-5801-4bdd-bdfd-a4878b9e7317?_state=0NkM--lD5vDA_wlPiPd1dEs-7WwDSmb_UfGJmMDAsIR7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiOGQ5N2FiMzEtNTgwMS00YmRkLWJkZmQtYTQ4NzhiOWU3MzE3IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA1OjU1LjE5MDY1NDkzWiJ9&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:06:07 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:e7ebc6e16708285bee3917ae12bf8d172ee0d7684a7830751ab9a1c070e7a125"],"Docker-Content-Digest":["sha256:e7ebc6e16708285bee3917ae12bf8d172ee0d7684a7830751ab9a1c070e7a125"]}
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["bb5ccb7c-4bf2-4a80-a78f-36cd01d139a5"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:06:08 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/bb5ccb7c-4bf2-4a80-a78f-36cd01d139a5?_state\u003dLyO6bZxCT0B1bfJXxnwVnsRmshIZgDvAr9VdREmmOEB7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiYmI1Y2NiN2MtNGJmMi00YTgwLWE3OGYtMzZjZDAxZDEzOWE1IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA2OjA3Ljk5NDA4MjYzNFoifQ%3D%3D"]}
code: $1
body:$2
DIGEST=$(sha256sum /home/user/container/ubuntu/b7f0f1a6360ea96cc4ec0a3a28aaf8a385807ed42ceb372cd46d08d12711ad45/layer.tar)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/b7f0f1a6360ea96cc4ec0a3a28aaf8a385807ed42ceb372cd46d08d12711ad45/layer.tar http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/bb5ccb7c-4bf2-4a80-a78f-36cd01d139a5?_state=LyO6bZxCT0B1bfJXxnwVnsRmshIZgDvAr9VdREmmOEB7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiYmI1Y2NiN2MtNGJmMi00YTgwLWE3OGYtMzZjZDAxZDEzOWE1IiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA2OjA3Ljk5NDA4MjYzNFoifQ%3D%3D&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:06:08 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:f934e33a54a60630267df295a5c232ceb15b2938ebb0476364192b1537449093"],"Docker-Content-Digest":["sha256:f934e33a54a60630267df295a5c232ceb15b2938ebb0476364192b1537449093"]}
curl -XPOST -H 'accept: application/json' http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/
response headers: {"Docker-Distribution-Api-Version":["registry/2.0"],"Docker-Upload-Uuid":["55b5d57c-4169-4884-8068-cf3a79fc8cef"],"X-Content-Type-Options":["nosniff"],"Range":["0-0"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:06:08 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/55b5d57c-4169-4884-8068-cf3a79fc8cef?_state\u003dy3gKd9CDD-Auw_mast0ki4dzXrO1vsnUOvv7eqZIgRl7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiNTViNWQ1N2MtNDE2OS00ODg0LTgwNjgtY2YzYTc5ZmM4Y2VmIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA2OjA4LjQwNDQ5ODcwM1oifQ%3D%3D"]}
code: $1
body:$2
DIGEST=$(sha256sum /home/user/container/ubuntu/e4415b714b624040f19f45994b51daed5cbdb00e0eb9a07221ff0bd6bcf55ed7.json)
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/e4415b714b624040f19f45994b51daed5cbdb00e0eb9a07221ff0bd6bcf55ed7.json http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/55b5d57c-4169-4884-8068-cf3a79fc8cef?_state=y3gKd9CDD-Auw_mast0ki4dzXrO1vsnUOvv7eqZIgRl7Ik5hbWUiOiJ0ZXN0MDEiLCJVVUlEIjoiNTViNWQ1N2MtNDE2OS00ODg0LTgwNjgtY2YzYTc5ZmM4Y2VmIiwiT2Zmc2V0IjowLCJTdGFydGVkQXQiOiIyMDE2LTExLTIzVDE2OjA2OjA4LjQwNDQ5ODcwM1oifQ%3D%3D&digest=sha256:${DIGEST}
code: 201
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["0"],"Date":["Wed, 23 Nov 2016 16:06:08 GMT"],"Content-Type":["text/plain; charset\u003dutf-8"],"Location":["http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/sha256:e4415b714b624040f19f45994b51daed5cbdb00e0eb9a07221ff0bd6bcf55ed7"],"Docker-Content-Digest":["sha256:e4415b714b624040f19f45994b51daed5cbdb00e0eb9a07221ff0bd6bcf55ed7"]}
curl -XPUT -H 'accept: application/json' -d #/home/user/container/ubuntu/manifest.json http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/manifests/16.04
code: 400
body: {"Docker-Distribution-Api-Version":["registry/2.0"],"X-Content-Type-Options":["nosniff"],"Content-Length":["118"],"Date":["Wed, 23 Nov 2016 16:06:08 GMT"],"Content-Type":["application/json; charset\u003dutf-8"]}
{"errors":[{"code":"MANIFEST_INVALID","message":"manifest invalid","detail":{"Value":"array","Type":{},"Offset":1}}]}
I've also tried to generate a manual manifest with the minimal content but also get error from the manifest PUT:
{
"schemaVersion": 2,
"name": "ubuntu",
"tag": "16.04",
"fsLayers": [
{"blobSum": "sha256:bf6751561805be7d07d66f6acb2a33e99cf0cc0a20f5fd5d94a3c7f8ae55c2a1"},
{"blobSum": "sha256:943edb549a8300092a714190dfe633341c0ffb483784c4fdfe884b9019f6a0b4"},
{"blobSum": "sha256:c1bd37d01c89de343d68867518b1155cb297d8e03942066ecb44ae8f46b608a3"},
{"blobSum": "sha256:e7ebc6e16708285bee3917ae12bf8d172ee0d7684a7830751ab9a1c070e7a125"},
{"blobSum": "sha256:f934e33a54a60630267df295a5c232ceb15b2938ebb0476364192b1537449093"}
]
}
Other details:
docker registry version :
registry github.com/docker/distribution v2.5.1
docker version:
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.6.2
Git commit: 23cf638
Built: Tue, 27 Sep 2016 12:25:38 +1300
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.6.2
Git commit: 23cf638
Built: Tue, 27 Sep 2016 12:25:38 +1300
OS/Arch: linux/amd64
I found only one article really describing this, which works.
https://www.danlorenc.com/post/containers-part-2/
The article describes to create and upload one layer with V1 config and Manifest to google registry, but it's a good base to learn the concept.
I'll put the concept down in case the website disappears, all credit to the author github.com/dlorenc of that article.
Basicly before creating your manifest, you need to create a v1+json config, and upload it as a blob, where the V1+json config contains the layers with the digest of the content, not the blob.
cat <<EOF > config.json
{
"architecture": "amd64",
"config": {
},
"history": [
{
"created_by": "Bash!"
}
],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:$(gunzip layer.tar.gz --to-stdout | shasum -a 256 | cut -d' ' -f1)"
]
}
}
EOF
With the config and layer in place, you can define the manifest:
# We need to know the size and digest of our layer and config:
size=$(wc -c layer.tar.gz | awk '{print $1}')
digest="sha256:$(shasum -a 256 layer.tar.gz | cut -d' ' -f1)"
config_size=$(wc -c config.json | awk '{print $1}')
config_digest="sha256:$(shasum -a 256 config.json | cut -d' ' -f1)"
cat << EOF > manifest.json
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": $config_size,
"digest": "$config_digest"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": $size,
"digest": "$digest"
}
]
}
EOF
Now you can upload your layers:
# Check to see if the layer exists:
returncode=$(curl -w "%{http_code}" \
-o /dev/null \
-I http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/$digest)
if [[ $returncode -ne 200 ]]; then
# Start the upload and get the location header.
# The HTTP response seems to include carriage returns, which we need to strip
location=$(curl -i -X POST \
http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/ \
-d "" | grep Location | cut -d" " -f2 | tr -d '\r')
# Do the upload
curl -X PUT $location\?digest=$digest --data-binary #layer.tar.gz
fi
Upload Config, basicly same code as for the layer:
returncode=$(curl -w "%{http_code}" -o /dev/null \
-I http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/$config_digest)
if [[ $returncode -ne 200 ]]; then
# Start the upload and get the location header.
# The HTTP response seems to include carriage returns, which we need to strip
location=$(curl -i -X POST \
http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/blobs/uploads/ \
-d "" | grep Location | cut -d" " -f2 | tr -d '\r')
# Do the upload
curl -X PUT $location\?digest=$config_digest --data-binary #config.json
fi
and TAG your image by pushing the manifest:
curl -X PUT \
http://<PRIVATE-REGISTRY-IP>:5000/v2/ubuntu/manifests/16.04 --data-binary #manifest.json
Remark
example code does not do the authorisation.
Does not work on the openshift online starter internal-registry (400 invalid manifest)
need manual redirect on gitlab-registry as it returns 400 with a location header for blobs HEAD and GET