Skip to content

Instantly share code, notes, and snippets.

@neilmillard
Last active May 9, 2022 09:56
Show Gist options
  • Select an option

  • Save neilmillard/cb32bf80204e785bd3380a15558115c2 to your computer and use it in GitHub Desktop.

Select an option

Save neilmillard/cb32bf80204e785bd3380a15558115c2 to your computer and use it in GitHub Desktop.

Revisions

  1. neilmillard revised this gist May 9, 2022. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion get_docker_image_tags.py
    Original file line number Diff line number Diff line change
    @@ -12,7 +12,7 @@ def parse_args():
    description="Display a summary of a docker image's key tags and how they relate."
    )
    parser.add_argument(
    "image_name", type=str, help="The name/repo of the image in live-artefacts."
    "image_name", type=str, help="The name/repo of the image."
    )
    return parser.parse_args()

  2. neilmillard renamed this gist May 9, 2022. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. neilmillard created this gist May 9, 2022.
    80 changes: 80 additions & 0 deletions get_tags.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,80 @@
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import argparse
    import os
    import re

    import requests


    def parse_args():
    parser = argparse.ArgumentParser(
    description="Display a summary of a docker image's key tags and how they relate."
    )
    parser.add_argument(
    "image_name", type=str, help="The name/repo of the image in live-artefacts."
    )
    return parser.parse_args()


    def get_docker_api_response(docker_api_path, headers=None):
    api_username = os.getenv("API_USERNAME")
    api_key = os.getenv("API_KEY")
    auth = requests.auth.HTTPBasicAuth(api_username, api_key)
    return requests.get(
    f"https://dockerhub/api/docker/{docker_api_path}",
    auth=auth,
    headers=headers,
    )


    def get_image_tags(image_name):
    return get_docker_api_response(f"{image_name}/v2/{image_name}/tags/list").json()[
    "tags"
    ]


    def get_image_tag_digest(image_name, image_tag):
    docker_content_digest = get_docker_api_response(
    f"{image_name}/v2/{image_name}/manifests/{image_tag}",
    headers={"Accept": "application/vnd.docker.distribution.manifest.v2+json"},
    ).headers["Docker-Content-Digest"]
    print(f"Digest for {image_name}:{image_tag} is {docker_content_digest}.")
    return docker_content_digest


    def get_image_tag_summary(image_name, image_tags, experimental_tag_digest, latest_tag_digest):
    semantic_version_tags = [tag for tag in image_tags if re.match(r"^\d+.\d+.\d+$", tag)]
    semantic_version_tags.sort(key=lambda x: [int(y) for y in x.split(".")])
    image_tag_summary = {
    "most_recent_sementic_version": semantic_version_tags[-1],
    "experimental_version": None,
    "latest_version": None,
    }
    experimental_tag_semantic_version = None
    latest_tag_semantic_version = None
    for semantic_version_tag in semantic_version_tags[::-1]:
    semantic_version_tag_digest = get_image_tag_digest(image_name, semantic_version_tag)
    if semantic_version_tag_digest == experimental_tag_digest:
    image_tag_summary["experimental_version"] = semantic_version_tag
    if semantic_version_tag_digest == latest_tag_digest:
    image_tag_summary["latest_version"] = semantic_version_tag
    if image_tag_summary["experimental_version"] and image_tag_summary["latest_version"]:
    break
    return image_tag_summary


    def main():
    args = parse_args()
    image_tags = get_image_tags(args.image_name)
    experimental_tag_digest = get_image_tag_digest(args.image_name, "experimental")
    latest_tag_digest = get_image_tag_digest(args.image_name, "latest")
    print(
    get_image_tag_summary(
    args.image_name, image_tags, experimental_tag_digest, latest_tag_digest
    )
    )


    if __name__ == "__main__":
    main()