Modules Go, référentiels Git privés et Dockerfiles

Apr 02 2023
Vous rencontrez des difficultés pour référencer des référentiels Git privés dans vos Dockerfiles ? Dans cet article de blog, je vais expliquer la cause du problème et proposer une solution simple pour le résoudre. Comment Go résout-il les modules ? Lors de la construction d'une application, Go résout les modules en vérifiant : Les modules dans les référentiels Git privés ne sont jamais servis par le serveur proxy Go.
Photo de Rubaitul Azad sur Unsplash

Vous rencontrez des difficultés pour référencer des référentiels Git privés dans vos Dockerfiles ? Dans cet article de blog, je vais expliquer la cause du problème et proposer une solution simple pour le résoudre.

Comment Go résout-il les modules ?

La figure 1 montre comment Go résout les dépendances pour les référentiels Git publics

Lors de la construction d'une application, Go résout les modules en vérifiant :

  • Tout d'abord, si le module est dans le cache de module local.
  • Sinon, il télécharge le module à partir du serveur proxy Go qui est un cache global pour les modules Go, permettant des builds plus rapides et plus efficaces. Si le module est trouvé, Go le stocke dans le cache du module local.
  • Si le module n'est pas présent sur le proxy, il est téléchargé et rendu disponible pour les requêtes ultérieures.
La figure 2 montre comment Go résout les dépendances pour les référentiels Git privés lorsque la variable GOPRIVATE est définie

Les modules des référentiels Git privés ne sont jamais servis par le serveur proxy Go. Il ne peut pas télécharger le module car il ne dispose pas des informations d'identification requises.

Dans ce cas, Go tentera de télécharger le module directement en clonant le dépôt Git privé. Il utilisera les informations d'identification git configurées sur votre machine pour le faire.

Avant d'essayer d'obtenir le module depuis le dépôt git, Go essaiera d'utiliser le proxy. Pour éviter cela, vous pouvez définir la GOPRIVATEvariable d'environnement pour indiquer à Go de traiter tous les modules d'un domaine spécifique comme privés. Par exemple:

go env -w "GOPRIVATE=github.com/neha-viswanathan/*"

Qu'en est-il des Dockerfiles ?

Pour construire avec succès votre binaire Go qui implique des modules Git privés avec Docker, vous devrez fournir des informations d'identification Git à votre contexte de construction Docker. La façon de procéder consiste à transmettre ces informations d'identification en tant qu'argument de construction à Docker.

Par exemple, si vous utilisez GitHub, vous pouvez fournir un jeton d'accès personnel comme identifiant à Docker comme suit :

# the build argument to pass the credentials
ARG GITHUB_TOKEN

# git is needed to download private go modules directly from git repositories
RUN apk add git

# configure git with PAT to access the private repositories
RUN git config --global --add url."@github.com/neha-viswanathan/">https://${GITHUB_TOKEN}@github.com/neha-viswanathan/".insteadOf "https://github.com/neha-viswanathan/"

  • la git configcommande réécrit les URL en ajoutant les informations d'identification requises.

export GITHUB_TOKEN="my personal access"
docker build --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} --no-cache -t image-name:tag .