Golang — Criando imagens docker like a boss

Allan Barbosa
allbarbos
Published in
2 min readJun 17, 2020

No dia a dia é um saco trabalhar com imagens docker de tamanhos exagerados e na maioria dos casos falta apenas um pouco de carinho pra criar um Dockerfile otimizado.

Sendo assim decidi compartilhar esse caso que atuei recentemente, onde o problema não era especificamente o tamanho da imagem, mas corroborava pra piorar o cenário e não dava pra deixar como estava.

Contexto

API Rest com alto throughput de request, rodava no k8s e pasmem, sua imagem final era de 1.04GB.

Daria pra listar vários problemas, mas nesse contexto pode prejudicar bastante o tempo para escalar novos pods e também no dia a dia o desenvolvimento para baixar imagens.

Como executamos o binário da aplicação podemos descartar todo o resto do projeto, deixando a imagem infinitamente menor ao manter todos arquivos, com isso podemos utilizar algumas soluções:

Alpine

Por ser uma distribuição leve, de cara temos uma redução significativa para 600MB sem quebrar muito a cabeça com o Dockerfile

Flags

Se fizer sentido para seu contexto, podemos remover as informações de flags ao compilar o binário, o que nos poupa alguns MBs, neste caso 4

Multi-stage builds

Podemos ir além com multi-stage builds e criar uma imagem com apenas o necessário para rodar a aplicação, assim teremos uma redução absurda de 594MB para míseros 21.8MB

UPX

E a cereja do bolo é o UPX que nos permite compactar binário e reduzir ainda mais o tamanho

Caso queira ver os dockerfiles que gerei as imagens basta acessar este gist.

Basicamente é isso que gostaria de compartilhar e espero conseguir ajudá-lo a criar imagens pequenas :)

--

--