Mettre à jour automatiquement une description sur le Docker Hub

Le Docker Hub c'est le registre officiel d'image Docker. L'annuaire où toutes les personnes qui créent et maintiennent des images Docker peuvent les mettre à la disposition de tous. Pour avoir le plus de succès possible, il est alors important de bien remplir la description de son image, en expliquant ce qu'elle contient, dans quel objectif a-t-elle était créée et surtout comment l'utiliser !

Pour les images évoluant de manière régulière, il peut être fastidieux de maintenir cette description à jour. Cette dernière étant généralement versionnée dans un dépôt avec les fichiers Dockerfile. C'est un cas que je rencontre avec les nightly builds des versions en développement de PHP où je dois maintenir à la fois le README du projet et la description sur le Docker Hub.

Pour simplifier ce travail et éviter la double intervention, j'ai récemment découvert les possibilités offertes par l'API de Docker Hub. Il existe ainsi une API permettant de mettre à jour les informations d'une image disponible dans l'annuaire. J'ai donc créé un script Shell qui lit le fichier README du dépôt et qui met à jour la description de l'image directement sur le Docker Hub.

#!/bin/bash

set -e

TOKEN=$(curl -s -X POST \
    -H "Content-Type: application/json" \
    -d '{"username": "'"$DOCKER_USERNAME"'", "password": "'"$DOCKER_PASSWORD"'"}' \
    https://hub.docker.com/v2/users/login/ | jq -r .token)

CODE=$(jq -n --arg msg "$(<README.md)" \
    '{"registry":"registry-1.docker.io","full_description": $msg }' | \
        curl -s -o /dev/null -L -w "%{http_code}" \
           https://cloud.docker.com/v2/repositories/"${DOCKER_IMAGE}"/ \
           -d @- -X PATCH \
           -H "Content-Type: application/json" \
           -H "Authorization: JWT ${TOKEN}")

if [[ "${CODE}" = "200" ]]; then
    printf "Successfully pushed README to Docker Hub\n"
else
    printf "Unable to push README to Docker Hub, response code: %s\n" "${CODE}"
    exit 1
fi

Ce dernier s'utilise comme ceci:

DOCKER_USERNAME=username \
  DOCKER_PASSWORD=password \
  DOCKER_IMAGE="user/image" \
  ./script.sh

Et voilà le tour joué !

Et pour rendre à Caesar ce qui appartient à Caesar, je n'ai aucun mérite. C'est en réalisant quelques recherches sur Internet que je suis tombé sur un projet qui avait la même problématique et que j'ai adapté le code à ce que je voulais en faire.