Quand on construit à partir de ou utilise une image docker qui se trouve le docker hub, on se retrouve à faire un requête de pull vers le docker hub. Or avec mon intégration continue sous GitLab qui construit avec docker (docker runner), je fais beaucoup de pull. Voici l’erreur de mon build:
Pulling docker image docker:latest ...
ERROR: Preparation failed: Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit (docker.go:119:2s)
Docker hub limite les pull
Depuis début novembre la politique de docker hub est de ne plus permettre un accès anonyme sans limite au registry. Ainsi sans authentification on va se voir progressivement limiter à 100 pull d’image par 6 heures. Actuellement la limite est 250 pour les usages anonymes. La solution est de s’enregistrer pour un compte gratuit afin d’avoir une limite de 200. Ce qui ne va pas me convenir car je suis déjà au-delà de 250 aujourd’hui ! Les comptes payants sont certe peu onéreux à partir de 5$/mois mais pourquoi engorger internet et faire du docker-hub un POF pour mon build ?
Besoin de pull
Certains build on besoin d’avoir la dernière version d’une image. C’est la cas quand j’utilise une dépendance dite « snapshot » en phase de développement. Il est alors utile de faire un pull de l’image utilisée. Ce pull est vraiment nécessaire quand l’image utilisée change pour un tag donnée (ex: latest) mais cette situation arrive sur mes propres images quand j’en développe plusieurs de concert. Pour les images en provenance de docker hub la version est souvent fixée.
Je peux donc me passer de faire des pull intempestif sur le docker hub.
Cas du runner docker
l’atteinte de ma limite d’accès au docker hub est à cherchée du côté de mes build dockerisé. En effet chaque job du CI/CD dans GitLab utilise un runner docker. Le runner est paramétré par défaut pour toujours faire un pull de l’image qu’il doit utilisé pour exécuter le build. Dans la trace de build en début de post on voir que j’utilise l’image docker et que celle-ci est tirée à chaque fois en début de build. C’est d’une part une perte de temps et d’autre part un peu un anti-pattern : je ferais mieux de fixer la version de docker que je veux utiliser !
Fixer la version ne règle pour autant pas mon problème de limite de pull. D’autant plus que j’ai découpé mes pipeline en différents jobs distincts afin d’introduire de la parallélisation. Chaque job donne lieu à pull.
Mais heureusement que le docker runner peut être paramétré pour ne pas faire de pull si l’image est déjà présente sur l’hôte docker. Ce qui est « toujours » le cas, depuis le temps que mon IC tourne. Dans le config.toml du gitlab-runner il suffit d’indiquer au docker runner de ne pas tirer l’image si elle est déjà présente:
[runners.docker]
pull_policy = "if-not-present"
Et voilà mon CI/CD est reparti de plus belle !
Tags: CI/CD Docker docker hub docker runner Gitlab