Golang — Criando imagens docker like a boss
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 :)