Comprimindo Binário Go com UPX

UPX
O upx (Ultimate Packer for eXecutables) é uma ferramenta de compressão de executáveis que pode reduzir significativamente o tamanho de binários compilados, incluindo aqueles gerados pela linguagem Go.
# receita rápida para baixar e usar o upx
cd /tmp
wget https://github.com/upx/upx/releases/download/v5.0.2/upx-5.0.2-amd64_linux.tar.xz
tar xf upx-5.0.2-amd64_linux.tar.xz
/tmp/upx-5.0.2-amd64_linux/upx -9 caminho-para-o-binario
Resultados com binário Go
Quando compilamos a aplicação Go sem fazer strip, obtemos um binário com 8914107 bytes:
go install ./app
Aplicando o upx ao binário sem strip, o tamanho reduz para 4850156 bytes:
/tmp/upx-5.0.2-amd64_linux/upx -9 ~/go/bin/app
Quando compilamos a aplicação Go com strip, o tamanho do binário fica em 6177060 bytes:
go install -ldflags='-s -w' ./app
Aplicando o upx ao binário com strip, o tamanho reduz para 2263460 bytes:
/tmp/upx-5.0.2-amd64_linux/upx -9 ~/go/bin/app
Vide resumo na tabela abaixo:
| Configuração | Tamanho (bytes) | Redução (%) |
|---|---|---|
| Sem strip | 8914107 | 0% |
| Com strip | 6177060 | 30.7% |
| Sem strip, com upx | 4850156 | 45.6% |
| Com strip, com upx | 2263460 | 74.6% |
Resultados com imagem no Docker Hub
No Docker Hub, a imagem com strip (sem upx), cujo executável aparece acima com 6177060 bytes, ficou com 2.49 MB.
Aplicando o upx ao binário com strip, o tamanho da imagem Docker foi reduzido para 2.12 MB.
A redução do tamanho final da imagem Docker foi de 14.8%.
Conclusão
O upx produziu boa redução no tamanho binário do Go: ~ 45% sem strip e ~ 63% em relação ao binário com strip.
Na imagem no Docker Hub, para binário com strip, a redução do upx foi menor (~ 14%), pois o registry já fornece compressão eficiente.