Dive, ferramenta para explorar imagens Docker e conteúdo de camadas
(github.com/wagoodman)- Dive é uma ferramenta para explorar camadas e conteúdo de arquivos de imagens Docker/OCI e encontrar oportunidades para reduzir o tamanho da imagem
- É possível executar
dive <your-image-tag>com uma tag, ID ou digest de imagem, ou fazer a análise logo após o build de uma só vez comdive build -t <some-tag>. - Ao selecionar uma camada, a ferramenta mostra uma árvore de arquivos que combina essa camada com as anteriores, permitindo verificar arquivos adicionados, modificados e removidos, além das alterações acumuladas, na árvore de arquivos
- A métrica experimental de image efficiency estima, em uma pontuação e no tamanho total, o espaço desperdiçado causado por arquivos duplicados, movimentação de arquivos entre camadas e arquivos que não foram completamente removidos
- Com
CI=true, é possível pular a UI e retornar aprovação/falha com base em critérios de eficiência da imagem e espaço desperdiçado, automatizando o gerenciamento do tamanho de imagens em pipelines de CI
O que o Dive faz
- Dive é uma ferramenta para explorar imagens Docker, conteúdo de camadas e formas de reduzir o tamanho de imagens Docker/OCI
- A execução básica consiste em passar uma tag, ID ou digest de imagem
dive <your-image-tag>
- Também pode ser executado como um contêiner Docker; nesse caso, é necessário montar o socket do Docker
- Usa a imagem
docker.io/wagoodman/dive nginx:latesté apresentado como imagem de exemplo
- Usa a imagem
- Para analisar uma imagem imediatamente após o build, pode-se usar o comando
dive buildno mesmo formato, em vez dedocker builddive build -t <some-tag> .
- No macOS, a execução da análise de build via contêiner só oferece suporte ao mecanismo de contêiner Docker
- O estado do projeto é beta quality, e solicitações de novos recursos ou bugs podem ser enviados como issues
Exploração de camadas e alterações de arquivos
- Ao selecionar uma camada à esquerda, a árvore de arquivos que combina essa camada com as anteriores é exibida à direita
- É possível navegar pela árvore de arquivos com as setas
- O estado dos arquivos alterados em cada camada é exibido na árvore de arquivos
- Alterado
- Modificado
- Adicionado
- Removido
- O modo de exibição das alterações pode ser ajustado com base em uma camada específica ou nas alterações acumuladas até aquela camada
Eficiência da imagem e estimativa de espaço desperdiçado
- O painel inferior esquerdo mostra informações básicas das camadas e a métrica experimental de image efficiency
- Essa métrica estima o espaço desperdiçado dentro da imagem
- Duplicação de arquivos entre camadas
- Movimentação de arquivos entre camadas
- Arquivos que não foram completamente removidos
- O resultado é fornecido como um score percentual e como o espaço total de arquivos desperdiçado
Uso como critério de aprovação/falha no CI
- Ao executar com a variável de ambiente
CI=true, o Dive pula a UI, analisa a imagem e fornece o resultado pass/fail pelo código de retorno - É possível configurar 3 critérios no arquivo
.dive-cina raiz do repositóriolowestEfficiency: falha se a eficiência ficar abaixo da proporção especificadahighestWastedBytes: falha se o espaço desperdiçado for igual ou superior ao tamanho especificadohighestUserWastedPercent: falha se a proporção de desperdício nas camadas do usuário for igual ou superior à proporção especificada
- No cálculo de
highestUserWastedPercent, a base image layer não é incluída no tamanho total da imagem - O caminho do arquivo de configuração de CI pode ser sobrescrito com a opção
--ci-config
Fontes de imagem e mecanismos de contêiner
- A opção
--sourcepermite escolher de onde a imagem de contêiner será obtidadive <your-image> --source <source>dive <source>://<your-image>
- As opções de
sourcecompatíveis são:docker: Docker engine, valor padrãodocker-archive: Docker Tar Archive no discopodman: Podman engine, compatível apenas com Linux
Instalação e formas de execução
- No Ubuntu/Debian, pode ser instalado por pacote
.debou via Snap - O método via Snap não é recomendado quando o Docker foi instalado com
apt-get, e há um aviso de que ele pode quebrar o Docker daemon existente - No RHEL/Centos, pode ser instalado por pacote
.rpm - No Arch Linux, está disponível no extra repository e pode ser instalado com pacman
- No macOS, pode ser instalado via Homebrew, MacPorts ou pelo build Darwin na releases page
- No Windows, pode ser instalado via Chocolatey, scoop,
wingetou pelo build Windows na releases page - Para instalar com a ferramenta do Go, é necessário Go 1.10 ou superior
go install github.com/wagoodman/dive@latest- Ao instalar por esse método, a versão correta não é exibida ao executar
dive -v
- Também são oferecidos métodos de instalação para Nix/NixOS e x-cmd
- Ao executar como imagem Docker, é necessário incluir o arquivo de socket do Docker
-v /var/run/docker.sock:/var/run/docker.sock
- Dependendo da versão local do Docker, pode ser necessário usar uma variável de ambiente como
DOCKER_API_VERSION=1.37 - Ao usar um runtime alternativo como Colima, pode ser necessário definir a variável de ambiente
DOCKER_HOSTpara obter imagens locais
Operação e configuração da UI
- Os principais atalhos alternam entre a visualização de camadas e a árvore de arquivos para navegação, filtragem e alternância de exibição
Ctrl+CouQ: sairTab: alternar entre visualização de camadas e árvore de arquivosCtrl+F: filtro de arquivosCtrl+A: na visualização de camadas, mostrar alterações acumuladas da imagem; na árvore de arquivos, alternar exibição de arquivos adicionadosCtrl+L: mostrar alterações da camada atualCtrl+R,Ctrl+M,Ctrl+U: alternar exibição de arquivos removidos, modificados e sem alteraçõesCtrl+B: alternar exibição de atributos de arquivos
- Nenhuma configuração separada é necessária, mas valores podem ser sobrescritos por um arquivo de configuração YAML
- Os itens configuráveis incluem mecanismo de contêiner, opção de ignorar erros de parsing de arquivos de imagem, logs, atalhos de teclado, exibição de diff, largura da árvore de arquivos, estado padrão de diretórios recolhidos e exibição de alterações acumuladas de camadas
- Os locais pesquisados para o arquivo de configuração são:
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml
- Também é possível usar a extensão
.ymlem vez de.yaml
1 comentários
Comentários do Hacker News
Ao lidar com imagens e camadas, o crane é excelente, e a biblioteca base, go-containerregistry, também é boa
Ele permite adicionar novas camadas a imagens existentes ou modificar metadados (env vars, labels, entrypoint etc.), e também “achatar” imagens com várias camadas em uma única camada
Também é possível fazer “rebase”, reaplicando as mudanças sobre uma nova imagem base, e tudo isso é feito diretamente no registry, sem precisar do Docker
https://github.com/google/go-containerregistry/blob/main/cmd...
craneCom isso, dá para gerenciar com Nix não só as dependências de build (por exemplo, Go), mas também ferramentas de empacotamento e distribuição (por exemplo, gnu tar, crane)
O dive foi realmente útil para entender como imagens Docker funcionam e como escrever um Dockerfile eficiente
Ler a documentação também é importante, mas ver diretamente como a estrutura de camadas resultante muda depois de alterar o Dockerfile foi decisivo para a compreensão
O Dive é excelente. Ferramentas como essa são importantes para aprender e ter confiança sobre exatamente o que estou construindo e distribuindo
O Dredge também é uma ferramenta que vale conferir, e eu o uso para comparar diferenças entre camadas
https://github.com/mthalman/dredge/blob/main/docs/commands/i...
https://blog.haschek.at/2019/the-curious-case-of-the-RasPi-i...
Pode ser uma pergunta boba, mas fico curioso por que a maioria das ferramentas de contêineres e infraestrutura é escrita em Go
Docker, Podman, nerdctl, Terraform e Kubernetes vêm à mente, e gostaria de saber se Go oferece alguma vantagem clara ao criar esse tipo de ferramenta
O principal motivo para reescrever em Go foi aproveitar a popularidade do Go, que estava crescendo na época (2012). Eu estava lá
A diferença fica clara se você imaginar Docker e Kubernetes escritos em outra linguagem popular
Como alternativa moderna e madura, Rust parece ser praticamente a única
O fato de haver muitos engenheiros Go nas equipes internas vem do mesmo motivo
Além disso, há o efeito de ecossistema: dá para aproveitar diretamente pacotes de outras implementações em partes do código
Gosto do Dive e o tiro da caixa de ferramentas várias vezes por mês
Mas fico me perguntando se existe uma forma de ver diretamente o conteúdo do arquivo selecionado. Muitas vezes quero verificar se um arquivo existe dentro de uma camada e depois examinar seu conteúdo; hoje normalmente executo o contêiner e uso
cat, ou extraio o conteúdo e entro na pastacatAo estender vários contêineres Docker públicos, o Dive me salvou várias vezes no processo de desmontar e entender o que eles fazem por dentro
É realmente um software nota A+
Existem outras ótimas ferramentas TUI de terminal como o dive. lazydocker e dry vêm à mente
Também há algumas na categoria Docker
[0] https://terminaltrove.com/
Conferi e ele permite ver as camadas, mas mostra apenas o comando de cada camada
O Dive é uma ferramenta incrível no universo de contêineres/Docker. Fica muito mais fácil depurar o que realmente existe dentro de um contêiner
Quando começamos o Depot [0], recebíamos muitas perguntas sobre como reduzir o tamanho das imagens e acelerar builds, então escrevi um texto curto [1] sobre como resolver esse problema com o Dive. Talvez esteja um pouco antigo agora, mas ainda pode ajudar alguém
Inspirados pelo Dive, também tornamos mais fácil mostrar o que realmente existe dentro do contexto de build a cada build, e lançamos isso como recurso do Depot algumas semanas atrás
[0] https://depot.dev
[1] https://depot.dev/blog/reducing-image-size-with-dive
[2] https://depot.dev/blog/build-context
Além de ser muito útil, o Dive tem uma vantagem subestimada: o autor é um excelente desenvolvedor e uma pessoa com quem é muito agradável trabalhar
A ferramenta container-diff do Google também é muito útil
Eu a uso para verificar o que scripts arbitrários recomendados para serem executados via pipe no bash vão fazer no sistema
É uma forma prática de executar testes de integração em apps ou imagens de contêiner
É uma pena que muitos dos mantenedores originais desses projetos open source do Google tenham saído, então eles parecem precisar de atenção. Tento enviar PRs quando posso e às vezes fechar issues. Em especial, essa ferramenta de testes é muito valiosa para manter a sanidade ao lidar internamente com muitas imagens base que precisamos manter