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.