Uma lição sobre dockerizar scripts de shell
Esforços para reduzir uma imagem Docker para uma ferramenta bash de 500 linhas destacam a troca entre tamanhos mínimos de imagem e manutenção de longo prazo. Comentadores alertam que copiar manualmente binários e bibliotecas compartilhadas para uma imagem `scratch` ou baseada em Alpine pode criar containers frágeis e difíceis de depurar, que quebram com atualizações do sistema operacional, por uma economia de espaço apenas marginal em relação a uma base simples de 30 MB. A conversa se amplia para quando faz sentido containerizar scripts shell simples, abordando alternativas como binários estáticos, BusyBox, Nix e gerenciadores de pacotes tradicionais, além de ferramentas para analisar e otimizar imagens.
Tamanho da imagem vs. complexidade
- Muitos acham que a imagem inicial de ~31 MB já é “pequena o suficiente”; reduzir mais para ~17 MB não valeria a complexidade extra na maioria dos usos em produção.
- Vários comentaristas preferem aceitar uma imagem de 30–40 MB a manter um Dockerfile frágil e altamente ajustado.
- Outros gostam do exercício de otimização como ferramenta de aprendizado e apreciam a exploração do que é minimamente necessário para executar o script.
Cópia de binários e bibliotecas compartilhadas
- Crítica forte a copiar binários e arquivos
.sodiretamente de uma imagem Alpine para outra (ou parascratch) e sobrescrever caminhos de sistema lib/bin. - Preocupações: divergência de versões, links simbólicos quebrados, incompatibilidades sutis conforme as imagens base evoluem, e imagens frágeis que podem quebrar silenciosamente depois.
- Alguns argumentam que isso é parcialmente mitigado quando a origem e o destino usam a mesma versão base, mas outros veem o padrão como uma reinvenção “anti‑gerenciador de pacotes”.
Alpine, reprodutibilidade e pinning
- Alpine é descrito como hostil ao pinning de versões e a builds reprodutíveis de longo prazo: pacotes e índices desaparecem rapidamente.
- Recomendação: não use Alpine se você precisa de builds Docker reprodutíveis e amigáveis ao cache; imagens Debian baseadas em snapshots são citadas como uma direção mais promissora.
Alternativas para imagens pequenas
- As sugestões incluem:
- Binários estáticos ou builds com BusyBox em vez de copiar muitas ferramentas individuais.
- Usar Nix para definir imagens de forma declarativa; funciona, pode ser muito pequeno, mas frequentemente traz fechamentos grandes (por exemplo,
gitMinimalainda é grande) e adiciona complexidade. - Reescrever a ferramenta em uma linguagem compilada com um único binário estático, se alguém estiver disposto a investir esforço.
Segurança, confiança e auditoria
- Debate sobre se “scripts shell aleatórios” ou “imagens Docker aleatórias” são mais seguros.
- Pontos a favor dos scripts: mais fáceis de ler e de passar por ferramentas como ShellCheck.
- Pontos a favor dos containers: isolamento via namespaces e controles de volume/rede, com ferramentas como Dive para inspecionar o conteúdo.
- Contraponto: containers não são barreiras fortes de segurança; existem escapes, e auditar imagens inteiras mais camadas base não é trivial.
Utilidade de dockerizar um script de shell
- Alguns consideram containerização exagerada para um script bash de 500 linhas que só precisa de ferramentas padrão.
- Outros argumentam que containers simplificam o gerenciamento de dependências e tornam as ferramentas reproduzíveis em muitas máquinas.
- Preocupações práticas levantadas: ainda é preciso um wrapper (script/alias/compose) para montar o diretório de trabalho e tornar o uso ergonômico.