Módulos Go, repositórios Git privados e Dockerfiles

Apr 02 2023
Você está tendo problemas para referenciar repositórios Git privados em seus Dockerfiles? Nesta postagem do blog, explicarei o que está causando o problema e oferecerei uma solução simples para resolvê-lo. Como o Go resolve os módulos? Ao construir um aplicativo, Go resolve os módulos verificando: Módulos em repositórios Git privados nunca são atendidos pelo servidor proxy Go.
Foto de Rubaitul Azad no Unsplash

Você está tendo problemas para referenciar repositórios Git privados em seus Dockerfiles? Nesta postagem do blog, explicarei o que está causando o problema e oferecerei uma solução simples para resolvê-lo.

Como o Go resolve os módulos?

A Figura 1 mostra como o Go resolve dependências para repositórios Git públicos

Ao construir um aplicativo, Go resolve os módulos verificando:

  • Primeiro, se o módulo estiver no cache do módulo local.
  • Caso contrário, ele baixa o módulo do servidor proxy Go, que é um cache global para os módulos Go, permitindo compilações mais rápidas e eficientes. Se o módulo for encontrado, Go o armazena no cache de módulo local.
  • Caso o módulo não esteja presente no proxy, ele é baixado e disponibilizado para requisições posteriores.
A Figura 2 mostra como o Go resolve dependências para repositórios Git privados quando a variável GOPRIVATE é definida

Módulos em repositórios Git privados nunca são servidos pelo servidor proxy Go. Ele não pode baixar o módulo porque não possui as credenciais necessárias.

Nesse caso, o Go tentará baixar o módulo diretamente clonando o repositório Git privado. Ele usará as credenciais git configuradas em sua máquina para fazer isso.

Antes de tentar obter o módulo do repositório git, o Go tentará usar o proxy. Para evitar isso, você pode definir a GOPRIVATEvariável de ambiente para dizer ao Go para tratar qualquer módulo em um domínio específico como privado. Por exemplo:

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

E os Dockerfiles?

Para construir com sucesso seu binário Go que envolve módulos Git privados com Docker, você precisará fornecer credenciais Git para seu contexto de construção Docker. A maneira de fazer isso é passar essas credenciais como um argumento de construção para o Docker.

Por exemplo, se você estiver usando o GitHub, poderá fornecer um token de acesso pessoal como credenciais para o Docker da seguinte maneira:

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

  • o git configcomando reescreve os URLs adicionando as credenciais necessárias.

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