Created
June 16, 2023 07:12
-
-
Save cs224/b67f985f9c807c4b4c6ab6dea4bbf41d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Author: cs224\n", | |
"\n", | |
"Last updated: 2023-06-16\n", | |
"\n", | |
"Python implementation: CPython\n", | |
"Python version : 3.8.12\n", | |
"IPython version : 8.2.0\n", | |
"\n", | |
"numpy : 1.23.1\n", | |
"pandas: 1.4.2\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"%load_ext watermark\n", | |
"%watermark -a 'cs224' -u -d -v -p numpy,pandas" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<style>.container { width:70% !important; }</style>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"from IPython.display import display, HTML, Markdown\n", | |
"\n", | |
"from IPython.display import display_html\n", | |
"def display_side_by_side(*args):\n", | |
" html_str=''\n", | |
" for df in args:\n", | |
" if type(df) == np.ndarray:\n", | |
" df = pd.DataFrame(df)\n", | |
" html_str+=df.to_html()\n", | |
" html_str = html_str.replace('table','table style=\"display:inline\"')\n", | |
" # print(html_str)\n", | |
" display_html(html_str,raw=True)\n", | |
"\n", | |
"CSS = \"\"\"\n", | |
".output {\n", | |
" flex-direction: row;\n", | |
"}\n", | |
"\"\"\"\n", | |
"\n", | |
"def display_graphs_side_by_side(*args):\n", | |
" html_str='<table><tr>'\n", | |
" for g in args:\n", | |
" html_str += '<td>'\n", | |
" html_str += g._repr_svg_()\n", | |
" html_str += '</td>'\n", | |
" html_str += '</tr></table>'\n", | |
" display_html(html_str,raw=True)\n", | |
" \n", | |
"\n", | |
"display(HTML(\"<style>.container { width:70% !important; }</style>\"))\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* [Tools To Deal With Container Images](https://github.com/iximiuz/awesome-container-tinkering/blob/4dd6940e98c1a3571f6612e6075efd2cb1b223bb/IMAGES.md#image-distribution)\n", | |
"* https://github.com/regclient/regclient\n", | |
"* https://github.com/containers/skopeo" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# regctl image inspect ghcr.io/home-assistant/home-assistant:stable\n", | |
"# regctl image manifest ghcr.io/home-assistant/home-assistant:stable\n", | |
"# regctl image manifest --format raw-body ghcr.io/home-assistant/home-assistant:stable\n", | |
"# regctl artifact tree ghcr.io/home-assistant/home-assistant:stable\n", | |
"# regctl registry login\n", | |
"# regctl image ratelimit influxdb:latest\n", | |
"# {\n", | |
"# \"Remain\": 200,\n", | |
"# \"Limit\": 200,\n", | |
"# \"Reset\": 0,\n", | |
"# \"Set\": true,\n", | |
"# \"Policies\": [\n", | |
"# \"200;w=21600\"\n", | |
"# ]\n", | |
"# }" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np, pandas as pd\n", | |
"import subprocess, json, re, collections" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"image = 'ghcr.io/home-assistant/home-assistant:stable'\n", | |
"image_base = 'ghcr.io/home-assistant/home-assistant'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def run_cmd(args, cwd = None, stdin_input=None, decode=True):\n", | |
" #out = subprocess.check_output(args, cwd=cwd)\n", | |
" if stdin_input is not None:\n", | |
" if isinstance(stdin_input, str):\n", | |
" stdin_input = str.encode(stdin_input)\n", | |
" out = subprocess.run(args, check=True, stdout=subprocess.PIPE, cwd=cwd, input=stdin_input).stdout #text=True, \n", | |
" else:\n", | |
" out = subprocess.run(args, check=True, stdout=subprocess.PIPE, cwd=cwd).stdout\n", | |
" \n", | |
" if decode:\n", | |
" return out.decode('utf-8')\n", | |
" else:\n", | |
" return out" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def get_image_tags(image_ref, pattern=r'^.*$'):\n", | |
" cmd = f'regctl tag ls {image_ref}'\n", | |
" cmd = [itm for itm in cmd.split(' ') if itm != '']\n", | |
" result = run_cmd(cmd).strip()\n", | |
" result = result.split('\\n')\n", | |
" result = [r for r in result if re.match(pattern, r)]\n", | |
" return result" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['2023.6.0.dev20230511',\n", | |
" '2023.6.0.dev20230513',\n", | |
" '2023.6.0.dev20230514',\n", | |
" '2023.6.0.dev20230515',\n", | |
" '2023.6.0.dev20230516',\n", | |
" '2023.6.0.dev20230517',\n", | |
" '2023.6.0.dev20230518',\n", | |
" '2023.6.0.dev20230519',\n", | |
" '2023.6.0.dev20230520',\n", | |
" '2023.6.0.dev20230521',\n", | |
" '2023.6.0.dev20230522',\n", | |
" '2023.6.0.dev20230523',\n", | |
" '2023.6.0.dev20230524',\n", | |
" '2023.6.0.dev20230525',\n", | |
" '2023.6.0.dev20230526',\n", | |
" '2023.6.0.dev20230527',\n", | |
" '2023.6.0.dev20230528',\n", | |
" '2023.6.0.dev20230529',\n", | |
" '2023.6.0.dev20230530',\n", | |
" '2023.6.0.dev20230531',\n", | |
" '2023.6.0b0',\n", | |
" '2023.6.0b1',\n", | |
" '2023.6.0b2',\n", | |
" '2023.6.0b3',\n", | |
" '2023.6.0b4',\n", | |
" '2023.6.0b5',\n", | |
" '2023.6.0b6',\n", | |
" '2023.6.1',\n", | |
" '2023.6.2',\n", | |
" '2023.7.0.dev20230601',\n", | |
" '2023.7.0.dev20230602',\n", | |
" '2023.7.0.dev20230603',\n", | |
" '2023.7.0.dev20230604',\n", | |
" '2023.7.0.dev20230605',\n", | |
" '2023.7.0.dev20230606',\n", | |
" '2023.7.0.dev20230607',\n", | |
" '2023.7.0.dev20230608',\n", | |
" '2023.7.0.dev20230609',\n", | |
" '2023.7.0.dev20230610',\n", | |
" '2023.7.0.dev20230611',\n", | |
" '2023.7.0.dev20230612',\n", | |
" '2023.7.0.dev20230613',\n", | |
" '2023.7.0.dev20230614',\n", | |
" '2023.7.0.dev20230615',\n", | |
" '2023.7.0.dev20230616',\n", | |
" 'beta',\n", | |
" 'dev',\n", | |
" 'latest',\n", | |
" 'rc',\n", | |
" 'stable']" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"get_image_tags(image_base)[-50:]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['2022.8.1',\n", | |
" '2022.8.2',\n", | |
" '2022.8.3',\n", | |
" '2022.8.4',\n", | |
" '2022.8.5',\n", | |
" '2022.8.6',\n", | |
" '2022.8.7',\n", | |
" '2022.9.0',\n", | |
" '2022.9.1',\n", | |
" '2022.9.2',\n", | |
" '2022.9.3',\n", | |
" '2022.9.4',\n", | |
" '2022.9.5',\n", | |
" '2022.9.6',\n", | |
" '2022.9.7',\n", | |
" '2023.1.0',\n", | |
" '2023.1.1',\n", | |
" '2023.1.2',\n", | |
" '2023.1.4',\n", | |
" '2023.1.5',\n", | |
" '2023.1.6',\n", | |
" '2023.1.7',\n", | |
" '2023.2.0',\n", | |
" '2023.2.1',\n", | |
" '2023.2.2',\n", | |
" '2023.2.3',\n", | |
" '2023.2.4',\n", | |
" '2023.2.5',\n", | |
" '2023.3.0',\n", | |
" '2023.3.1',\n", | |
" '2023.3.2',\n", | |
" '2023.3.3',\n", | |
" '2023.3.4',\n", | |
" '2023.3.5',\n", | |
" '2023.3.6',\n", | |
" '2023.4.0',\n", | |
" '2023.4.1',\n", | |
" '2023.4.2',\n", | |
" '2023.4.3',\n", | |
" '2023.4.4',\n", | |
" '2023.4.5',\n", | |
" '2023.4.6',\n", | |
" '2023.5.0',\n", | |
" '2023.5.1',\n", | |
" '2023.5.2',\n", | |
" '2023.5.3',\n", | |
" '2023.5.4',\n", | |
" '2023.6.0',\n", | |
" '2023.6.1',\n", | |
" '2023.6.2']" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"get_image_tags(image_base, pattern=r'^\\d\\d\\d\\d\\.\\d+\\.\\d+$')[-50:]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def get_image_metadata(image_ref, platform='linux/amd64'):\n", | |
" cmd = f'regctl image inspect --platform {platform} {image_ref}'\n", | |
" cmd = [itm for itm in cmd.split(' ') if itm != '']\n", | |
" result = run_cmd(cmd)\n", | |
" result = json.loads(result)\n", | |
" return result" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'2023-06-15T04:44:26.960037188Z'" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"get_image_metadata(image)['created']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def get_image_manifest(image_ref):\n", | |
" cmd = f'regctl image manifest {image_ref}'\n", | |
" cmd = [itm for itm in cmd.split(' ') if itm != '']\n", | |
" result1 = run_cmd(cmd).split('\\n')[:3]\n", | |
" result = []\n", | |
" for r in result1:\n", | |
" result += [[_.strip() for _ in r.split(':')]]\n", | |
" result_ = result\n", | |
" \n", | |
" cmd = f'regctl image manifest --format raw-body {image_ref}'\n", | |
" cmd = [itm for itm in cmd.split(' ') if itm != '']\n", | |
" result = run_cmd(cmd)\n", | |
" result = json.loads(result)\n", | |
" return result_ + result['manifests']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[['Name', 'ghcr.io/home-assistant/home-assistant', 'stable'],\n", | |
" ['MediaType', 'application/vnd.docker.distribution.manifest.list.v2+json'],\n", | |
" ['Digest',\n", | |
" 'sha256',\n", | |
" '8e069fcfddbd95c0acff88b9e515e3b208c2a5b4ad801a8f0cb8b55be417fc45'],\n", | |
" {'mediaType': 'application/vnd.docker.distribution.manifest.v2+json',\n", | |
" 'size': 6386,\n", | |
" 'digest': 'sha256:f2788cff750499781f5be851e95a0d1906141e22b4187aa8f5a150d0728d57fc',\n", | |
" 'platform': {'architecture': 'arm64', 'os': 'linux', 'variant': 'v8'}},\n", | |
" {'mediaType': 'application/vnd.docker.distribution.manifest.v2+json',\n", | |
" 'size': 6386,\n", | |
" 'digest': 'sha256:d23d82c22c4dc97a3d0c187d7cd9e8370033798222683c45b8b80a0ad8a81620',\n", | |
" 'platform': {'architecture': 'amd64', 'os': 'linux'}},\n", | |
" {'mediaType': 'application/vnd.docker.distribution.manifest.v2+json',\n", | |
" 'size': 6387,\n", | |
" 'digest': 'sha256:fc8754954cdabbd9ff670f0d5b8db08be5b6e80bdb6e83055335eb8b5e568362',\n", | |
" 'platform': {'architecture': 'arm', 'os': 'linux', 'variant': 'v6'}},\n", | |
" {'mediaType': 'application/vnd.docker.distribution.manifest.v2+json',\n", | |
" 'size': 6386,\n", | |
" 'digest': 'sha256:cca6f53f8c72c29a84697d9ae953bf2e0ad7099b4ae645ef748c5d84cb1ae36c',\n", | |
" 'platform': {'architecture': 'arm', 'os': 'linux', 'variant': 'v7'}},\n", | |
" {'mediaType': 'application/vnd.docker.distribution.manifest.v2+json',\n", | |
" 'size': 6386,\n", | |
" 'digest': 'sha256:2c9c9c97b60635f64f3ec0a0b68b0ce335db26af158d345d9f09f1cd5e1560da',\n", | |
" 'platform': {'architecture': '386', 'os': 'linux'}}]" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"r = get_image_manifest(image)\n", | |
"r" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def generate_docker_image_overview(image_ref, tag_pattern=r'^.*$', tag_limit=20):\n", | |
" tags = get_image_tags(image_ref, pattern=tag_pattern)\n", | |
" tags.reverse()\n", | |
" r = []\n", | |
" for tag in tags[:tag_limit]:\n", | |
" img_ref = image_ref + ':' + tag\n", | |
" meta = get_image_metadata(img_ref)\n", | |
" dt = pd.to_datetime(meta['created'])\n", | |
" labels = meta['config']['Labels']\n", | |
" manifests = get_image_manifest(img_ref)\n", | |
" digest = ':'.join(manifests[2][1:])\n", | |
" platform = ''\n", | |
" entry = collections.OrderedDict(tag=tag, dt=dt, digest=digest, platform=platform, labels=json.dumps(labels))\n", | |
" r += [entry]\n", | |
" for manifest in manifests[3:]:\n", | |
" digest = manifest['digest']\n", | |
" platform = manifest['platform']['os'] + '/' + manifest['platform']['architecture']\n", | |
" entry = collections.OrderedDict(tag=tag, dt=dt, digest=digest, platform=platform, labels=json.dumps(labels))\n", | |
" r += [entry]\n", | |
" \n", | |
" rdf = pd.DataFrame(r)\n", | |
" return rdf" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"CPU times: user 28.7 ms, sys: 79.6 ms, total: 108 ms\n", | |
"Wall time: 21.3 s\n" | |
] | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"ldf = generate_docker_image_overview(image_base, tag_pattern=r'^\\d\\d\\d\\d\\.\\d+\\.\\d+$', tag_limit=10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>tag</th>\n", | |
" <th>dt</th>\n", | |
" <th>digest</th>\n", | |
" <th>platform</th>\n", | |
" <th>labels</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:8e069fcfddbd95c0acff88b9e515e3b208c2a5b...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:f2788cff750499781f5be851e95a0d1906141e2...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:d23d82c22c4dc97a3d0c187d7cd9e8370033798...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:fc8754954cdabbd9ff670f0d5b8db08be5b6e80...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:cca6f53f8c72c29a84697d9ae953bf2e0ad7099...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2023.6.2</td>\n", | |
" <td>2023-06-15 04:44:26.960037188+00:00</td>\n", | |
" <td>sha256:2c9c9c97b60635f64f3ec0a0b68b0ce335db26a...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:d1dadb8e6ae23c76875c24b72c7af85cbf0e35f...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:f4a9ab7dc35ac54860dc302e354a7ed6d31f598...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:a29527b65f76ca36451aed4a4ae8859821c54e4...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:417bcfbbd3357486b06d24d7df2989707376d78...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>10</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:2b5353ac0757d74452495fa8fbe35827b87baed...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>11</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:15c7c127dca4c024ea541a858ee3f1422b7b4c2...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>12</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:a1f116fea0091f48ea5bf1323538afae176ab0f...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>13</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:d0c0aa9b48ecf65f4ca9d4b548b887d11f29139...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>14</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:cdeb41f8ee47ac85ab0861d7c25e339fd23a798...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>15</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:a90656ab6c58ebe18455929537ba685fb9ba218...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>16</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:2f8fe4dcaba6664f12c3760daa0ade3ffcb15e0...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>17</th>\n", | |
" <td>2023.6.0</td>\n", | |
" <td>2023-06-07 14:17:50.352968105+00:00</td>\n", | |
" <td>sha256:49ae1363b4734a7ece2d5cfbebcce099a8e236d...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>18</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:2c631c99d7078072126e50050b57042ec5548b7...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>19</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:aace2c05d1c22903f5349a0ffa5ed74afc7abec...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>20</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:7d851868869d5b7633eda6d0c88828304f05a01...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>21</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:6106389e694e6eb3d26f33f024d377bbf00cd4b...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>22</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:e54b316ea9733f4fcace778c22ee20ad60fc4d6...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>23</th>\n", | |
" <td>2023.5.4</td>\n", | |
" <td>2023-05-23 22:07:32.617477863+00:00</td>\n", | |
" <td>sha256:c381ad9968f711c64d4c36481312f6dbc5edab6...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>24</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:24ac7c2b44448cfd17fe02372b4a3ecbe120230...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:e34b66e7275b1783c7020c8c27300b9913ff3e6...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>26</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:654a2279df6b34203573bcb6096798dadc5441f...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>27</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:0a61a2024b644ce3bab8dfa01c745141096868a...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>28</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:d02169dee31829eb90930c1332318aa8f273094...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>29</th>\n", | |
" <td>2023.5.3</td>\n", | |
" <td>2023-05-14 17:21:09.668837214+00:00</td>\n", | |
" <td>sha256:b3da8afb852dfefdd9414e2f0e52d8d632caa29...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>30</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:40c15990157cf3240f873c32bc5a327fa8fc2b1...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>31</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:0e32f1ef4cef379806fbace43cf49f99233f69a...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>32</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:1b961b865ec8679f3dc438a41ce4b1ed0114b19...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>33</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:9ce281df8bccfb301b6d86dfab3cdadadca1727...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>34</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:730c829a5704500e00fe4283626d06d7cce23cc...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>35</th>\n", | |
" <td>2023.5.2</td>\n", | |
" <td>2023-05-05 19:36:51.208333508+00:00</td>\n", | |
" <td>sha256:de2276535b3e7034e399c59b4d2b05c3e265e6e...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>36</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:fc2d1d28f9e1ae317b50f293ce36dd37e36a030...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>37</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:26354e7ebef8e1c85f53a9ab4ddb6f4c1f40930...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>38</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:2a161b8fb8ce22ad965656c8f513b8f82d0a646...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>39</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:49fc3c6abcc3b8016af1acb24aaeec0d7ea9c52...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>40</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:cf7c3003e4b324ba17c74c7cdc05e76164f064b...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>41</th>\n", | |
" <td>2023.5.1</td>\n", | |
" <td>2023-05-04 23:55:12.579704982+00:00</td>\n", | |
" <td>sha256:c40091823cfa8d453066fa07eb3fb45830d0dbc...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>42</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:2939bbadb03ff22b047da6c47f5c372d0ffdb24...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>43</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:9966316ad5a1ed67dfe8c4ed139995d8a5975a4...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>44</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:3de6c6dc0b2ecf3c0fbd433d437349d507156cb...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>45</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:c4174c0b300afc58d14f37422531dca9438e2ed...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>46</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:891a0177140523e7be3ec22d54ade22c569fff3...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>47</th>\n", | |
" <td>2023.5.0</td>\n", | |
" <td>2023-05-03 19:03:08.227804935+00:00</td>\n", | |
" <td>sha256:281fc2eed9845eea7e437eccd2320412ffb000a...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>48</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:f25710773690a4a0809797862b8762daf38774d...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>49</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:97752e894572f77af77e78a5b7cc595b346a73f...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:732a6d23ccb7d7de00c22ea0adc14bf846cb4f0...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>51</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:1652d63ce298be8ac934be4bcaf95b2d948f776...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>52</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:49e512096f0100038a8825c143372d10e85dcc2...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>53</th>\n", | |
" <td>2023.4.6</td>\n", | |
" <td>2023-04-22 00:44:00.828004568+00:00</td>\n", | |
" <td>sha256:ce82b13c3c3f157c5792a08cdd3b7f7b84428cc...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>54</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:37f519d97494dee68c4536515992961b52dc631...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>55</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:d642d13d3f3f2d031649603ad075ef8b74996e4...</td>\n", | |
" <td>linux/arm64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>56</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:417433e41c056d4f0fea0a5ee1b65b542f19025...</td>\n", | |
" <td>linux/amd64</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>57</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:3bb3624f438fe8ea9fa2078e527b6319587b199...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>58</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:e0279e4f19d0470b242f9f80f4f85ed9d79dd18...</td>\n", | |
" <td>linux/arm</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>59</th>\n", | |
" <td>2023.4.5</td>\n", | |
" <td>2023-04-18 02:35:17.189187876+00:00</td>\n", | |
" <td>sha256:75dc9e878f2a04262473b101f9191042d13a46b...</td>\n", | |
" <td>linux/386</td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" tag dt \\\n", | |
"0 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"1 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"2 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"3 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"4 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"5 2023.6.2 2023-06-15 04:44:26.960037188+00:00 \n", | |
"6 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"7 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"8 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"9 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"10 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"11 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"12 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"13 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"14 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"15 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"16 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"17 2023.6.0 2023-06-07 14:17:50.352968105+00:00 \n", | |
"18 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"19 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"20 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"21 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"22 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"23 2023.5.4 2023-05-23 22:07:32.617477863+00:00 \n", | |
"24 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"25 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"26 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"27 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"28 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"29 2023.5.3 2023-05-14 17:21:09.668837214+00:00 \n", | |
"30 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"31 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"32 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"33 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"34 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"35 2023.5.2 2023-05-05 19:36:51.208333508+00:00 \n", | |
"36 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"37 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"38 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"39 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"40 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"41 2023.5.1 2023-05-04 23:55:12.579704982+00:00 \n", | |
"42 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"43 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"44 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"45 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"46 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"47 2023.5.0 2023-05-03 19:03:08.227804935+00:00 \n", | |
"48 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"49 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"50 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"51 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"52 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"53 2023.4.6 2023-04-22 00:44:00.828004568+00:00 \n", | |
"54 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"55 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"56 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"57 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"58 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"59 2023.4.5 2023-04-18 02:35:17.189187876+00:00 \n", | |
"\n", | |
" digest platform \\\n", | |
"0 sha256:8e069fcfddbd95c0acff88b9e515e3b208c2a5b... \n", | |
"1 sha256:f2788cff750499781f5be851e95a0d1906141e2... linux/arm64 \n", | |
"2 sha256:d23d82c22c4dc97a3d0c187d7cd9e8370033798... linux/amd64 \n", | |
"3 sha256:fc8754954cdabbd9ff670f0d5b8db08be5b6e80... linux/arm \n", | |
"4 sha256:cca6f53f8c72c29a84697d9ae953bf2e0ad7099... linux/arm \n", | |
"5 sha256:2c9c9c97b60635f64f3ec0a0b68b0ce335db26a... linux/386 \n", | |
"6 sha256:d1dadb8e6ae23c76875c24b72c7af85cbf0e35f... \n", | |
"7 sha256:f4a9ab7dc35ac54860dc302e354a7ed6d31f598... linux/arm64 \n", | |
"8 sha256:a29527b65f76ca36451aed4a4ae8859821c54e4... linux/amd64 \n", | |
"9 sha256:417bcfbbd3357486b06d24d7df2989707376d78... linux/arm \n", | |
"10 sha256:2b5353ac0757d74452495fa8fbe35827b87baed... linux/arm \n", | |
"11 sha256:15c7c127dca4c024ea541a858ee3f1422b7b4c2... linux/386 \n", | |
"12 sha256:a1f116fea0091f48ea5bf1323538afae176ab0f... \n", | |
"13 sha256:d0c0aa9b48ecf65f4ca9d4b548b887d11f29139... linux/arm64 \n", | |
"14 sha256:cdeb41f8ee47ac85ab0861d7c25e339fd23a798... linux/amd64 \n", | |
"15 sha256:a90656ab6c58ebe18455929537ba685fb9ba218... linux/arm \n", | |
"16 sha256:2f8fe4dcaba6664f12c3760daa0ade3ffcb15e0... linux/arm \n", | |
"17 sha256:49ae1363b4734a7ece2d5cfbebcce099a8e236d... linux/386 \n", | |
"18 sha256:2c631c99d7078072126e50050b57042ec5548b7... \n", | |
"19 sha256:aace2c05d1c22903f5349a0ffa5ed74afc7abec... linux/arm64 \n", | |
"20 sha256:7d851868869d5b7633eda6d0c88828304f05a01... linux/amd64 \n", | |
"21 sha256:6106389e694e6eb3d26f33f024d377bbf00cd4b... linux/arm \n", | |
"22 sha256:e54b316ea9733f4fcace778c22ee20ad60fc4d6... linux/arm \n", | |
"23 sha256:c381ad9968f711c64d4c36481312f6dbc5edab6... linux/386 \n", | |
"24 sha256:24ac7c2b44448cfd17fe02372b4a3ecbe120230... \n", | |
"25 sha256:e34b66e7275b1783c7020c8c27300b9913ff3e6... linux/arm64 \n", | |
"26 sha256:654a2279df6b34203573bcb6096798dadc5441f... linux/amd64 \n", | |
"27 sha256:0a61a2024b644ce3bab8dfa01c745141096868a... linux/arm \n", | |
"28 sha256:d02169dee31829eb90930c1332318aa8f273094... linux/arm \n", | |
"29 sha256:b3da8afb852dfefdd9414e2f0e52d8d632caa29... linux/386 \n", | |
"30 sha256:40c15990157cf3240f873c32bc5a327fa8fc2b1... \n", | |
"31 sha256:0e32f1ef4cef379806fbace43cf49f99233f69a... linux/arm64 \n", | |
"32 sha256:1b961b865ec8679f3dc438a41ce4b1ed0114b19... linux/amd64 \n", | |
"33 sha256:9ce281df8bccfb301b6d86dfab3cdadadca1727... linux/arm \n", | |
"34 sha256:730c829a5704500e00fe4283626d06d7cce23cc... linux/arm \n", | |
"35 sha256:de2276535b3e7034e399c59b4d2b05c3e265e6e... linux/386 \n", | |
"36 sha256:fc2d1d28f9e1ae317b50f293ce36dd37e36a030... \n", | |
"37 sha256:26354e7ebef8e1c85f53a9ab4ddb6f4c1f40930... linux/arm64 \n", | |
"38 sha256:2a161b8fb8ce22ad965656c8f513b8f82d0a646... linux/amd64 \n", | |
"39 sha256:49fc3c6abcc3b8016af1acb24aaeec0d7ea9c52... linux/arm \n", | |
"40 sha256:cf7c3003e4b324ba17c74c7cdc05e76164f064b... linux/arm \n", | |
"41 sha256:c40091823cfa8d453066fa07eb3fb45830d0dbc... linux/386 \n", | |
"42 sha256:2939bbadb03ff22b047da6c47f5c372d0ffdb24... \n", | |
"43 sha256:9966316ad5a1ed67dfe8c4ed139995d8a5975a4... linux/arm64 \n", | |
"44 sha256:3de6c6dc0b2ecf3c0fbd433d437349d507156cb... linux/amd64 \n", | |
"45 sha256:c4174c0b300afc58d14f37422531dca9438e2ed... linux/arm \n", | |
"46 sha256:891a0177140523e7be3ec22d54ade22c569fff3... linux/arm \n", | |
"47 sha256:281fc2eed9845eea7e437eccd2320412ffb000a... linux/386 \n", | |
"48 sha256:f25710773690a4a0809797862b8762daf38774d... \n", | |
"49 sha256:97752e894572f77af77e78a5b7cc595b346a73f... linux/arm64 \n", | |
"50 sha256:732a6d23ccb7d7de00c22ea0adc14bf846cb4f0... linux/amd64 \n", | |
"51 sha256:1652d63ce298be8ac934be4bcaf95b2d948f776... linux/arm \n", | |
"52 sha256:49e512096f0100038a8825c143372d10e85dcc2... linux/arm \n", | |
"53 sha256:ce82b13c3c3f157c5792a08cdd3b7f7b84428cc... linux/386 \n", | |
"54 sha256:37f519d97494dee68c4536515992961b52dc631... \n", | |
"55 sha256:d642d13d3f3f2d031649603ad075ef8b74996e4... linux/arm64 \n", | |
"56 sha256:417433e41c056d4f0fea0a5ee1b65b542f19025... linux/amd64 \n", | |
"57 sha256:3bb3624f438fe8ea9fa2078e527b6319587b199... linux/arm \n", | |
"58 sha256:e0279e4f19d0470b242f9f80f4f85ed9d79dd18... linux/arm \n", | |
"59 sha256:75dc9e878f2a04262473b101f9191042d13a46b... linux/386 \n", | |
"\n", | |
" labels \n", | |
"0 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"1 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"2 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"3 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"4 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"5 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"6 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"7 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"8 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"9 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"10 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"11 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"12 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"13 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"14 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"15 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"16 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"17 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"18 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"19 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"20 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"21 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"22 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"23 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"24 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"25 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"26 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"27 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"28 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"29 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"30 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"31 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"32 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"33 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"34 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"35 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"36 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"37 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"38 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"39 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"40 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"41 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"42 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"43 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"44 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"45 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"46 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"47 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"48 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"49 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"50 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"51 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"52 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"53 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"54 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"55 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"56 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"57 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"58 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... \n", | |
"59 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... " | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ldf" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# docker image ls --digests\n", | |
"# docker image inspect --format '{{json .}}' ghcr.io/home-assistant/home-assistant:stable | jq .\n", | |
"# docker image inspect --format '{{json .}}' ghcr.io/home-assistant/home-assistant:stable | jq '.RepoDigests[0]'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"repo_digest_part = 'd1dadb8e6'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>tag</th>\n", | |
" <th>dt</th>\n", | |
" <th>digest</th>\n", | |
" <th>platform</th>\n", | |
" <th>labels</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2023.6.1</td>\n", | |
" <td>2023-06-08 19:24:18.420101786+00:00</td>\n", | |
" <td>sha256:d1dadb8e6ae23c76875c24b72c7af85cbf0e35f...</td>\n", | |
" <td></td>\n", | |
" <td>{\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":...</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" tag dt \\\n", | |
"6 2023.6.1 2023-06-08 19:24:18.420101786+00:00 \n", | |
"\n", | |
" digest platform \\\n", | |
"6 sha256:d1dadb8e6ae23c76875c24b72c7af85cbf0e35f... \n", | |
"\n", | |
" labels \n", | |
"6 {\"io.hass.arch\": \"amd64\", \"io.hass.base.arch\":... " | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ldf[ldf['digest'].str.contains(repo_digest_part)]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# list(ldf['digest'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.12" | |
}, | |
"toc": { | |
"base_numbering": 1, | |
"nav_menu": {}, | |
"number_sections": true, | |
"sideBar": true, | |
"skip_h1_title": false, | |
"title_cell": "Table of Contents", | |
"title_sidebar": "Contents", | |
"toc_cell": false, | |
"toc_position": {}, | |
"toc_section_display": true, | |
"toc_window_display": false | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Corresponding blog post: https://weisser-zwerg.dev/posts/docker-find-image-tag-version