Skip to content

Instantly share code, notes, and snippets.

@thcipriani
Last active January 7, 2019 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thcipriani/7d7633eb238cd868d5ba24d0f1069463 to your computer and use it in GitHub Desktop.
Save thcipriani/7d7633eb238cd868d5ba24d0f1069463 to your computer and use it in GitHub Desktop.
Because I can never remember how to find docker images and their tags
#!/usr/bin/env bash
BASE="/home/thcipriani/public_html/docker"
INDEX="${BASE}/index.html"
IMAGES="$(wm-docker-tags --repos)"
IMAGE_LIST=
mkdir -p "$BASE"
make_image_index() {
local image="$1"
local image_base="${BASE}/${image}/tags"
local image_index="${image_base}/index.html"
local top_dir="$(realpath --relative-to="$image_base" "$BASE")"
cat > "$image_index" <<IMAGEINDEX
<!doctype html5>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Wikimedia Docker - Image: ${image}</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="${top_dir}/style.css" type="text/css" />
</head>
<body>
<h1>Wikimedia Docker - Image: ${image}</h1>
<nav>
<a href="${top_dir}">HOME</a>
</nav>
IMAGEINDEX
local tags="$(wm-docker-tags --image-tags "$image")"
local latest=$(echo $tags | tr ' ' '\n' | grep -v latest | sort -Vr | head -1)
local latest_img="docker-registry.wikimedia.org/${image}:${latest}"
printf '<div class="download"><h2>Download:</h2><code><pre>docker pull %s</pre></code></div>' "$latest_img" >> "$image_index"
printf '<div class="tags"><h2>Tags:</h2>' >> "$image_index"
local taglist
for tag in $tags; do
taglist+="<li>${tag}</li>"
done
printf '<ul>%b</ul></div>\n</body>\n</html>' "$taglist">> "$image_index"
}
cat > "$INDEX" <<HEAD
<!doctype html5>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Wikimedia Docker - Images</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<h1>Wikimedia Docker - Images</h1>
<nav>
<a href="${top_dir}">HOME</a>
</nav>
HEAD
for image in $IMAGES; do
make_image_index "${image}"
IMAGE_LIST+="<li><a href=\"$image/tags/\">$image</a></li>"
done
printf '<ul>%b</ul>\n</body\n</html>\n' "$IMAGE_LIST" >> "$INDEX"
#!/usr/bin/env python
"""
wm-docker-tags.py
~~~~~~~~~~~~~~~~~
Quick python script to try to get some visibility
into the Wikimedia Docker registry.
"""
import argparse
import json
import os
import re
import requests
class DockerRegistry(object):
def __init__(self, url, version='v2'):
self.registry = url
self.version = version
self._pagination_re = re.compile('<([^>]*)>')
self.repos = self.get_repos()
def _query_repo(self, endpoint):
base_path = self.registry
if not endpoint.startswith('v2'):
base_path = os.path.join(self.registry, self.version)
r = requests.get(os.path.join(base_path, endpoint))
r.raise_for_status()
return r
def _page_repos(self, query, repos):
response = self._query_repo(query)
repos += response.json().get('repositories')
# Docker registry paginates and sends continuation header 'Link'
next_link = response.headers.get('link')
if not next_link:
return repos
page = self._pagination_re.search(next_link)
page = page.group(1)
if page.startswith('/'):
return self._page_repos(page[1:], repos)
return self._page_repos(page, repos)
def get_repos(self):
repos = []
return self._page_repos('_catalog', repos)
def __getitem__(self, image):
response = self._query_repo(os.path.join(image, 'tags', 'list'))
return response.json()
def parse_args():
ap = argparse.ArgumentParser()
g = ap.add_mutually_exclusive_group(required=True)
g.add_argument('--repos', action='store_true')
g.add_argument('--image-tags', metavar='IMAGE_NAME')
return ap.parse_args()
def main():
args = parse_args()
registry = DockerRegistry('https://docker-registry.wikimedia.org')
if args.repos:
print('\n'.join(registry.repos))
return 0
tags = registry[args.image_tags]
print('Tags for "{image_name}"\n---\n{image_tags}'.format(
image_name=tags['name'],
image_tags='\n'.join(tags['tags']),
))
return 0
if __name__ == '__main__':
main()
@thcipriani
Copy link
Author

~
(/^ヮ^)/*:・゚✧ mw-docker-tags --image-tags releng/perl
Tags for "releng/perl"
---
5.24.1
latest

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