# Mais Uma Ferramenta para Containers - CRANE

## Introdução

Estava fazendo alguns estudos sobre as ferramentas do [Sigstore](https://www.sigstore.dev/) e acabei me deparando com uma menção a uma ferramenta para manipulação de imagens e registries que eu não conhecia, de nome [Crane](https://github.com/google/go-containerregistry/tree/main/cmd/crane). Identifiquei logo de cara que havia alguns recursos interessantes que poderiam auxiliar na inspeção e manipulação de imagens. Baixei a ferramenta e comecei os testes. Para o meu caso, que uso o Manjaro, bastou rodar um comando para completar a instalação.

```bash
pacman -S crane
```
Segue abaixo a lista de comandos que achei mais interessante para o meu uso. Para ver todos os subcomandos, basta rodar `crane -h`.

## Exemplos de aplicação

Referência para a lista de comandos:

- https://github.com/google/go-containerregistry/blob/main/cmd/crane/recipes.md

### Listar todas as tags de um repositório

```bash
crane ls docker.io/library/nginx
```

### Logar em um registry

```bash
crane auth login reg.example.com -u AzureDiamond -p hunter2
```

### Inspecionar o config de uma imagem

```bash
crane config ubuntu:22.04 | jq
```

### Inspecionar o manifesto de uma imagem

```bash
crane manifest ubuntu:22.04 | jq
```

### Exportar o sistema de arquivo do container como um tarball

```bash
crane export ubuntu ubuntu.tar
```

### Baixar uma imagem e salvá-la localmente em um tarball

```bash
crane pull ubuntu:22.10 ubuntu2210.tar
```

### Listar arquivos de uma imagem

```bash
crane export ubuntu - | tar -tvf - | less
```

### Extrair um arquivo de uma imagem

```bash
crane export ubuntu - | tar -Oxf - etc/passwd
```

Observação: certifique de remover a "/" do início do caminho do arquivo.

### Crie uma image a partir de um diretório

```bash
crane append -f <(tar -f - -c some-dir/) -t ${IMAGE}
```

Por padrão, isso produz uma imagem com uma camada contendo o conteúdo o diretório. Adicione `-b ${BASE_IMAGE}` para anexar a camada a uma imagem base.

Esse exemplo carece de validação. Pelos testes que fiz localmente, ele tenta fazer a modificação remotamente no registry.

### Verificar a diferença de configs de duas imagens

```bash
diff <(crane config busybox:1.32 | jq) <(crane config busybox:1.33 | jq)
```

### Verificar a diferença de manifestos de duas imagens

```bash
diff <(crane manifest busybox:1.32 | jq) <(crane manifest busybox:1.33 | jq)
```

### Verificar a diferença do sistema de arquivo

```bash
diff \
    <(crane export gcr.io/kaniko-project/executor:v1.6.0-debug - | tar -tvf - | sort) \
    <(crane export gcr.io/kaniko-project/executor:v1.7.0-debug - | tar -tvf - | sort)
```

### Identificar o tamanho da imagem

```bash
crane manifest gcr.io/buildpacks/builder:v1 | jq '.config.size + ([.layers[].size] | add)' | numfmt --to=iec
```



