Na primeira parte desse tutorial, configuramos o Bazel e o gazelle em nosso projeto. Ao final conseguimos utilizar o Bazel para gerar nosso arquivo binário.
Agora que já temos todo o ambiente configurado e funcionando, vamos adicionar as regras para gerar uma imagem e subir ela para um registry.
Primeiro passo é adicionar o http_archive das regras do docker no arquivo WORKSPACE.
http_archive(
name = "io_bazel_rules_docker",
sha256 = "59536e6ae64359b716ba9c46c39183403b01eabfbd57578e84398b4829ca499a",
strip_prefix = "rules_docker-0.22.0",
urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.22.0/rules_docker-v0.22.0.tar.gz"],
)
As regras do docker já vem com algumas funções para auxiliar na criação de imagens para linguagens como Python, NodeJS, Java, C e etc…
Para carregar as funções de auxílio do Go, precisamos adicionar dois load no arquivo WORKSPACE.
load(
"@io_bazel_rules_docker//repositories:repositories.bzl",
container_repositories = "repositories",
)
container_repositories()
load(
"@io_bazel_rules_docker//go:image.bzl",
_go_image_repos = "repositories",
)
_go_image_repos()
Pronto, agora que temos tudo o que precisamos do docker configurado em nosso projeto, abrindo o arquivo BUILD que se encontra na raiz do projeto, vamos carregar a função go_image e configurá-la.
load("@io_bazel_rules_docker//go:image.bzl", "go_image")
go_image(
name = "api_image",
binary = ":gorilla",
importpath = "github.com/aprendagolang/gorilla",
)
No primeiro parâmetro, name, podemos colocar qualquer coisa. Escolhemos api_image por ser a regra quer irá gerar a imagem da nossa API.
O segundo parâmetro, no exemplo que encontramos no repositório das regras do docker, seria o srcs, parâmetro que configura-se passando os nomes dos arquivos .go, assim como fizemos na função go_binary. Como já usamos a função go_binary, mudamos o segundo parâmetro para o binary, onde tudo que precisamos fazer é apontar para a regra que gera o binário do nosso programa.
Por último, configuramos o importpath, que nada mais é do que o nome do nosso módulo.
Para garantir que está tudo funcionando 100%, execute um bazel build api_image. Se você não recebeu nenhum erro, quer dizer que tudo funcionou como deveria, e que agora só falta fazer o push dessa imagem.
Nessa etapa, ainda no arquivo BUILD da raiz do nosso projeto, precisamos fazer o load da função container_push e configurá-la.
load("@io_bazel_rules_docker//container:container.bzl", "container_push")
container_push(
name = "push_api",
image = ":api_image",
registry = "index.docker.io",
repository = "aprendagolang/gorilla-mux",
tag = "bazel",
)
Como para todas as regras do bazel, o parâmetro name pode ser qualquer coisa. Escolhemos push_api.
No parâmetro image, passamos o nome da regra que está gerando a imagem, no nosso caso api_image.
As três próximas regras definem para onde o push será feito, qual repositório e tag. Como estamos fazendo o push para o docker hub, o registry deve ser index.docker.io. No repository, preenchemos com “USERNAME/NOME_DA_IMAGEM”. Na tag colocamos bazel só para referenciar como geramos nossa imagem.
Antes de fazer o push, é necessário que você esteja logado em sua conta do docker. Para fazer isso no terminal, é só executar docker login -u USERNAME e depois digitar sua senha.
Regra configurada e logado no docker, agora rodamos o comando bazel para executar a regra push_api.
$ bazel run push_api
Pronto, se você for até sua conta do docker, vai ver que uma nova imagem foi adicionada. Para ver a que geramos aqui, é só clicar aqui!
Deixem suas dúvidas nos comentários.
Até a próxima!
Faça parte da comunidade!
Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.
Livros Recomendados
Abaixo listei alguns dos melhores livros que já li sobre GO.

