Skip to content

Instantly share code, notes, and snippets.

@cirocosta
Created May 24, 2017 14:09
Show Gist options
  • Save cirocosta/fb6b90cb7651ff21eda4838a73e3710b to your computer and use it in GitHub Desktop.
Save cirocosta/fb6b90cb7651ff21eda4838a73e3710b to your computer and use it in GitHub Desktop.
Retrieve image configuration from Docker Hub Registry
#!/bin/bash
set -o errexit
main() {
check_args "$@"
local image=$1
local tag=$2
local token=$(get_token $image)
local digest=$(get_digest $image $tag $token)
get_image_configuration $image $token $digest
}
get_image_configuration() {
local image=$1
local token=$2
local digest=$3
echo "Retrieving Image Configuration.
IMAGE: $image
TOKEN: $token
DIGEST: $digest
" >&2
curl \
--silent \
--location \
--header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/blobs/$digest" \
| jq -r '.container_config'
}
get_token() {
local image=$1
echo "Retrieving Docker Hub token.
IMAGE: $image
" >&2
curl \
--silent \
"https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io" \
| jq -r '.token'
}
get_digest() {
local image=$1
local tag=$2
local token=$3
echo "Retrieving image digest.
IMAGE: $image
TAG: $tag
TOKEN: $token
" >&2
curl \
--silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer $token" \
"https://registry-1.docker.io/v2/$image/manifests/$tag" \
| jq -r '.config.digest'
}
check_args() {
if (($# != 2)); then
echo "Error:
Two arguments must be provided - $# provided.
Usage:
./get-image-config.sh <image> <tag>
Aborting."
exit 1
fi
}
main "$@"
@cirocosta
Copy link
Author

./get-image-config.sh library/mongo latest
Retrieving Docker Hub token.
    IMAGE: library/mongo
  
Retrieving image digest.
    IMAGE:  library/mongo
    TAG:    latest
    TOKEN:  eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDTHpDQ0FkU2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXp0Uk5Gb3pPa2RYTjBrNldGUlFSRHBJVFRSUk9rOVVWRmc2TmtGRlF6cFNUVE5ET2tGU01rTTZUMFkzTnpwQ1ZrVkJPa2xHUlVrNlExazFTekFlRncweE56QTFNREl5TWpBME5UZGFGdzB4T0RBMU1ESXlNakEwTlRkYU1FWXhSREJDQmdOVkJBTVRPMDFPTms0NlJraFVWenBKV0VWSE9rOUpOMUU2UVRWWFJqcFpSRVUwT2pkRE4wNDZSMWRKVVRvMVZ6STNPa2hPTlVvNlZVNURRVG95U0UxQ01Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU5KRklhQ1hHNWYxSk9BZnZSaTJDU081K1Q5RVpKd2doai9SUXgzNW9Uc3Q4RnhXY0dRc3ZOMG5sdW5DVVdIbENxN2I4NFJRTXV0WUVIUnY4MVhweTU2T0JzakNCcnpBT0JnTlZIUThCQWY4RUJBTUNCNEF3RHdZRFZSMGxCQWd3QmdZRVZSMGxBREJFQmdOVkhRNEVQUVE3VFU0MlRqcEdTRlJYT2tsWVJVYzZUMGszVVRwQk5WZEdPbGxFUlRRNk4wTTNUanBIVjBsUk9qVlhNamM2U0U0MVNqcFZUa05CT2pKSVRVSXdSZ1lEVlIwakJEOHdQWUE3VVRSYU16cEhWemRKT2xoVVVFUTZTRTAwVVRwUFZGUllPalpCUlVNNlVrMHpRenBCVWpKRE9rOUdOemM2UWxaRlFUcEpSa1ZKT2tOWk5Vc3dDZ1lJS29aSXpqMEVBd0lEU1FBd1JnSWhBSTJVUlpMQVRTM3R4bjNpNTY0SXVQSFEwQU1Mb1g5cTZCMmdnN01KSHJuTkFpRUE0Q3lzbmtENHhjQm42amdobVdnQzczQjdGVkszenFnOTV4ZjNRK2xGVHlrPSJdfQ.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvbW9uZ28iLCJhY3Rpb25zIjpbInB1bGwiXX1dLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuaW8iLCJleHAiOjE0OTU2MzUyNTIsImlhdCI6MTQ5NTYzNDk1MiwiaXNzIjoiYXV0aC5kb2NrZXIuaW8iLCJqdGkiOiJucEFNalVGNnpPWm9SU3dUOFFhVSIsIm5iZiI6MTQ5NTYzNDY1Miwic3ViIjoiIn0.d4fyLQP1_I8rC5z31j0Kt0jj7oRAgNtNUlVr8k1c5BspB7xLX7Tfri9g3YLHFQsZQO8LIf8O2laZtAoKqjbUzQ
  
Retrieving Image Configuration.
    IMAGE:  library/mongo
    TOKEN:  eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDTHpDQ0FkU2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXp0Uk5Gb3pPa2RYTjBrNldGUlFSRHBJVFRSUk9rOVVWRmc2TmtGRlF6cFNUVE5ET2tGU01rTTZUMFkzTnpwQ1ZrVkJPa2xHUlVrNlExazFTekFlRncweE56QTFNREl5TWpBME5UZGFGdzB4T0RBMU1ESXlNakEwTlRkYU1FWXhSREJDQmdOVkJBTVRPMDFPTms0NlJraFVWenBKV0VWSE9rOUpOMUU2UVRWWFJqcFpSRVUwT2pkRE4wNDZSMWRKVVRvMVZ6STNPa2hPTlVvNlZVNURRVG95U0UxQ01Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU5KRklhQ1hHNWYxSk9BZnZSaTJDU081K1Q5RVpKd2doai9SUXgzNW9Uc3Q4RnhXY0dRc3ZOMG5sdW5DVVdIbENxN2I4NFJRTXV0WUVIUnY4MVhweTU2T0JzakNCcnpBT0JnTlZIUThCQWY4RUJBTUNCNEF3RHdZRFZSMGxCQWd3QmdZRVZSMGxBREJFQmdOVkhRNEVQUVE3VFU0MlRqcEdTRlJYT2tsWVJVYzZUMGszVVRwQk5WZEdPbGxFUlRRNk4wTTNUanBIVjBsUk9qVlhNamM2U0U0MVNqcFZUa05CT2pKSVRVSXdSZ1lEVlIwakJEOHdQWUE3VVRSYU16cEhWemRKT2xoVVVFUTZTRTAwVVRwUFZGUllPalpCUlVNNlVrMHpRenBCVWpKRE9rOUdOemM2UWxaRlFUcEpSa1ZKT2tOWk5Vc3dDZ1lJS29aSXpqMEVBd0lEU1FBd1JnSWhBSTJVUlpMQVRTM3R4bjNpNTY0SXVQSFEwQU1Mb1g5cTZCMmdnN01KSHJuTkFpRUE0Q3lzbmtENHhjQm42amdobVdnQzczQjdGVkszenFnOTV4ZjNRK2xGVHlrPSJdfQ.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvbW9uZ28iLCJhY3Rpb25zIjpbInB1bGwiXX1dLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuaW8iLCJleHAiOjE0OTU2MzUyNTIsImlhdCI6MTQ5NTYzNDk1MiwiaXNzIjoiYXV0aC5kb2NrZXIuaW8iLCJqdGkiOiJucEFNalVGNnpPWm9SU3dUOFFhVSIsIm5iZiI6MTQ5NTYzNDY1Miwic3ViIjoiIn0.d4fyLQP1_I8rC5z31j0Kt0jj7oRAgNtNUlVr8k1c5BspB7xLX7Tfri9g3YLHFQsZQO8LIf8O2laZtAoKqjbUzQ
    DIGEST: sha256:34ba9aead2724ad9eb51c629bd66e66d9394f5a071855abe1d25226bf07487f9
  
{
  "Hostname": "3160d2e63219",
  "Domainname": "",
  "User": "",
  "AttachStdin": false,
  "AttachStdout": false,
  "AttachStderr": false,
  "ExposedPorts": {
    "27017/tcp": {}
  },
  "Tty": false,
  "OpenStdin": false,
  "StdinOnce": false,
  "Env": [
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
    "GOSU_VERSION=1.7",
    "GPG_KEYS=0C49F3730359A14518585931BC711F9BA15703C6",
    "MONGO_MAJOR=3.4",
    "MONGO_VERSION=3.4.4",
    "MONGO_PACKAGE=mongodb-org"
  ],
  "Cmd": [
    "/bin/sh",
    "-c",
    "#(nop) ",
    "CMD [\"mongod\"]"
  ],
  "ArgsEscaped": true,
  "Image": "sha256:2082cf5247203fcd3ba0e4da2d2258661f9180eb580de69d762225b879cd9b41",
  "Volumes": {
    "/data/configdb": {},
    "/data/db": {}
  },
  "WorkingDir": "",
  "Entrypoint": [
    "docker-entrypoint.sh"
  ],
  "OnBuild": [],
  "Labels": {}
}

@4rajeshr
Copy link

4rajeshr commented Jun 1, 2018

Thank you, you saved my day. 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment