News    MTB    Rennrad    Ski    Konzerte    GPS    Links    † Jens    |    Bilder bei flickr    

Docker Pull Count

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 "[email protected]"
      - 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.