Módulos Go, repositorios Git privados y Dockerfiles

Apr 02 2023
¿Tiene problemas para hacer referencia a repositorios Git privados en sus Dockerfiles? En esta publicación de blog, explicaré qué está causando el problema y ofreceré una solución simple para resolverlo. ¿Cómo resuelve Go los módulos? Al compilar una aplicación, Go resuelve los módulos al verificar: El servidor proxy de Go nunca sirve los módulos en los repositorios privados de Git.
Foto de Rubaitul Azad en Unsplash

¿Tiene problemas para hacer referencia a repositorios Git privados en sus Dockerfiles? En esta publicación de blog, explicaré qué está causando el problema y ofreceré una solución simple para resolverlo.

¿Cómo resuelve Go los módulos?

La figura 1 muestra cómo resuelve Go las dependencias de los repositorios públicos de Git.

Al crear una aplicación, Go resuelve los módulos comprobando:

  • Primero, si el módulo está en el caché del módulo local.
  • De lo contrario, descarga el módulo del servidor proxy Go, que es un caché global para los módulos Go, lo que permite compilaciones más rápidas y eficientes. Si se encuentra el módulo, Go lo almacena en la memoria caché del módulo local.
  • Si el módulo no está presente en el proxy, se descarga y se pone a disposición para solicitudes posteriores.
La figura 2 muestra cómo Go resuelve las dependencias de los repositorios privados de Git cuando se establece la variable GOPRIVATE.

Los módulos en repositorios privados de Git nunca son atendidos por el servidor proxy de Go. No puede descargar el módulo porque no tiene las credenciales requeridas.

En ese caso, Go intentará descargar el módulo directamente mediante la clonación del repositorio privado de Git. Utilizará las credenciales de git configuradas en su máquina para hacerlo.

Antes de intentar obtener el módulo del repositorio de git, Go intentará usar el proxy. Para evitar esto, puede configurar la GOPRIVATEvariable de entorno para decirle a Go que trate cualquier módulo bajo un dominio específico como privado. Por ejemplo:

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

¿Qué pasa con los archivos Docker?

Para compilar con éxito su binario de Go que involucre módulos Git privados con Docker, deberá proporcionar credenciales de Git a su contexto de compilación de Docker. La forma de hacerlo es pasar estas credenciales como un argumento de compilación a Docker.

Por ejemplo, si usa GitHub, puede proporcionar un token de acceso personal como credenciales a Docker de la siguiente manera:

# 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/"

  • el git configcomando vuelve a escribir las URL agregando las credenciales requeridas.

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