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!