Docker Hub ist die Container-Registry. Wer öffentliche Docker Images bereitstellt, macht es meist dort.

Nun möchte man vielleicht wissen, wie oft ein Image heruntergeladen wurde. Diese Info findet sich natürlich auch auf Docker Hub, allerdings nur sehr grob.

Beispiel: Das offizielle Traefik Image hat als Count 10M+, also > 10.000.000. Tatsächlich sind es beim Schreiben dieses Artikel aber 1.306.540.518. Woher die genaue Zahl stammt? Docker Hub bietet dafür eine API, im Fall Traefik bekommt man die Info's als json unter dieser Url.

Was leider fehlt ist eine Historie. Die kann man sich aber leicht selbst bauen (natürlich nicht rückwirkend). Das habe ich in GitLab realisiert.

Dazu legt man dort ein Repository an und fügt eine .gitlab-ci.yaml mit folgendem Inhalt hinzu:

image: alpine:latest

stages:
  - build

variables:
  imagelist: "traefik ghost"

build:
  stage: build
  script:
  - apk add git curl jq
  - git config --global user.email "you@example.com"
  - git config --global user.name "${CI_PROJECT_NAMESPACE}"  
  - |
    set -- $imagelist
    while [ -n "$1" ]; do
      cnt=$(curl https://hub.docker.com/v2/repositories/library/$1/ | jq -r .pull_count)
      (echo $(date -I"minutes") $cnt && cat $1.log) > $1.log1 && mv $1.log1 $1.log
      cat $1.log
      git add $1.log
      shift
    done
  - git commit --amend -m "dayly count [ci skip]"
  - git push -f https://${CI_PROJECT_NAMESPACE}:${PERSONAL_ACCESS_TOKEN}@gitlab.com/${CI_PROJECT_PATH}.git HEAD:master
  only:
  - master

Im obigen Beispiel werden die Counts der beiden (offiziellen) Images traefik und ghost abgefragt. Das library in der curl-Url steht für offizielle Docker Images, will man sonstige Images abfragen ist dies entsprechend zu ersetzen.

Für jedes Image wird eine log-Datei angelegt (traefik.log usw.) in die am Dateianfang der neueste Count gespeichert wird.

Die veränderten log-Dateien werden danach wieder ins Repository gepusht, wofür die Variable ${PERSONAL_ACCESS_TOKEN} benötigt wird (in GitLab Access-Token erzeugen und als Variable im Projekt hinterlegen).

Beim Commit wird --amend benutzt. Dies überschreibt immer den letzten Commit, um hier unnötige Historie zu vermeiden. Wichtig ist auch das [ci skip] in der Commit Message, damit die Pipeline nicht endlos getriggert wird.

Bleibt am Ende noch einen Scheduled Task in Gitlab anzulegen, der die Counts dann z. Bsp. täglich abholt.