Ben Chuanlong Du's Blog

And let it direct your passion with reason.

Deleting Docker Image Tags on DockerHub using the Python Module requests

Tips

  1. You can use Convert curl syntax to Python, Node.js, PHP, R or curlconverter to convert CURL commands to Python requests code.

Get All Tags of a Docker Image

In [1]:
import requests
In [2]:
url = "https://hub.docker.com/v2/repositories/dclong/jupyterhub-ds/tags/"
res = requests.get(url)
res
Out[2]:
<Response [200]>
In [4]:
res.json()["results"]
Out[4]:
[{'creator': 866262,
  'id': 78982771,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:9cc71546886c737af290a3d70103e63e8ffdcbf5c49a403cc2f466b4bee455e0',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1603009050}],
  'last_updated': '2020-03-29T00:42:36.291312Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': 'latest',
  'repository': 1838633,
  'full_size': 1603009050,
  'v2': True},
 {'creator': 866262,
  'id': 92776564,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:9cc71546886c737af290a3d70103e63e8ffdcbf5c49a403cc2f466b4bee455e0',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1603009050}],
  'last_updated': '2020-03-29T00:42:43.407048Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200328',
  'repository': 1838633,
  'full_size': 1603009050,
  'v2': True},
 {'creator': 866262,
  'id': 80522269,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:9cc71546886c737af290a3d70103e63e8ffdcbf5c49a403cc2f466b4bee455e0',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1603009050}],
  'last_updated': '2020-03-28T17:56:29.182608Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': 'next',
  'repository': 1838633,
  'full_size': 1603009050,
  'v2': True},
 {'creator': 866262,
  'id': 91939644,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:acb385b55453255fa1cdd984227e7a010ed9acbc6f6a3f5dd3b55f0a95160118',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1939413195}],
  'last_updated': '2020-03-23T23:44:29.506295Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200323',
  'repository': 1838633,
  'full_size': 1939413195,
  'v2': True},
 {'creator': 866262,
  'id': 91756137,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:db0d72d5f0611e7edb7a8b37ee095b692ebde18fb45ec7549bad0dd11b812e3a',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1941758508}],
  'last_updated': '2020-03-22T09:37:22.329669Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200322',
  'repository': 1838633,
  'full_size': 1941758508,
  'v2': True},
 {'creator': 866262,
  'id': 90270919,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:f9ab05f682af5f91b36e4c54d2170c6f6a5a6b5a95774dab85fa67446362b4e1',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1496134944}],
  'last_updated': '2020-03-12T00:30:18.53872Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200312',
  'repository': 1838633,
  'full_size': 1496134944,
  'v2': True},
 {'creator': 866262,
  'id': 89804112,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:50503edbd3965932ea6829c6c93dfc53f76c5cd84a40f5ac8fd18e4b4a41bba0',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1482447679}],
  'last_updated': '2020-03-09T01:38:59.53255Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200309',
  'repository': 1838633,
  'full_size': 1482447679,
  'v2': True},
 {'creator': 866262,
  'id': 89795707,
  'image_id': None,
  'images': [{'architecture': 'amd64',
    'features': '',
    'variant': None,
    'digest': 'sha256:50503edbd3965932ea6829c6c93dfc53f76c5cd84a40f5ac8fd18e4b4a41bba0',
    'os': 'linux',
    'os_features': '',
    'os_version': None,
    'size': 1482447679}],
  'last_updated': '2020-03-08T23:20:10.409408Z',
  'last_updater': 866262,
  'last_updater_username': 'dclong',
  'name': '200308',
  'repository': 1838633,
  'full_size': 1482447679,
  'v2': True}]

Get Token for Authentication

You need authentication to delete a tag from a Docker Image on DockerHub.

In [146]:
res = requests.post(
    url="https://hub.docker.com/v2/users/login/",
    data={"username": "YOUR_USER_NAME", "password": "YOUR_PASSWORD"},
)

Once the above POST comamnd is executed successfully, the token can be extracted using the following statement.

In [ ]:
res.json()["token"]

Deleting a Tag of a Docker Image

The example below delete the tag 200302 from the Docker image dclong/jupyterhub-ds.

In [156]:
url = "https://hub.docker.com/v2/repositories/dclong/jupyterhub-ds/tags/200302/"
requests.delete(
    url,
    headers={
        "Content-Type": "application/json",
        "Authorization": f"JWT {res.json()['token']}",
    },
)
Out[156]:
<Response [204]>

Comments