Imagens minúsculas do Docker que acreditavam em si *

[referência ao conto de fadas infantil americano "O pequeno motor que poderia" - aprox. por.] *



Como criar automaticamente imagens minúsculas de janela de encaixe para suas necessidades


Obsessão incomum


Nos últimos dois meses, fiquei obcecado por uma obsessão: quanto posso reduzir a imagem do Docker para que o aplicativo funcione?


Eu entendo que a ideia é estranha.


Antes de me aprofundar nos detalhes e nos conhecimentos técnicos, gostaria de explicar por que esse problema me enganou tanto e como isso o preocupa.


Por que o tamanho importa


Ao diminuir o conteúdo da imagem do Docker, reduzimos a lista de vulnerabilidades. Além disso, tornamos as imagens mais limpas, porque elas contêm apenas o que você precisa para executar aplicativos.


Há outra pequena vantagem - as imagens baixam um pouco mais rápido, mas, quanto a mim, isso não é tão importante.


Observação: se você se preocupa com o tamanho, a aparência do Alpine é pequena e provavelmente será adequada para você.

Imagens Distroless


O projeto Distroless oferece uma seleção de imagens "distroless" básicas; elas não contêm os gerenciadores de pacotes, shells ou outros utilitários que você está acostumado a ver na linha de comando. Como resultado, o uso de gerenciadores de pacotes como pip e apt falhará:


 FROM gcr.io/distroless/python3 RUN pip3 install numpy 

Dockerfile usando uma imagem distroless do Python 3


 Sending build context to Docker daemon 2.048kB Step 1/2 : FROM gcr.io/distroless/python3 ---> 556d570d5c53 Step 2/2 : RUN pip3 install numpy ---> Running in dbfe5623f125 /bin/sh: 1: pip3: not found 

Nenhum pip na imagem


Normalmente, esse problema é resolvido por uma compilação de vários estágios:


 FROM python:3 as builder RUN pip3 install numpy FROM gcr.io/distroless/python3 COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/ 

Montagem em várias etapas


O resultado é uma imagem de tamanho 130MB. Não é tão ruim! Para comparação: a imagem Python, por padrão, pesa 929 MB, e a “mais fina” ( 3,7-slim polegadas) - 179 MB, a imagem alpina ( 3,7-alpine polegadas) - 98,6 MB, enquanto a imagem básica sem distração usada no exemplo é 50,9MB.


Podemos apontar corretamente que, no exemplo anterior, estamos copiando todo o diretório /usr/local/lib/python3.7/site-packages , que pode conter dependências desnecessárias para nós. Embora esteja claro que a diferença de tamanho de todas as imagens base existentes do Python varia.


No momento em que escrevemos essas linhas, o Google distroless não suporta muitas imagens: Java e Python ainda estão em fase experimental e o Python existe apenas para 2.7 e 3.5.

Imagens minúsculas


Vamos voltar à minha obsessão em criar pequenas imagens.


Na verdade, eu queria ver como as imagens sem distração funcionam. O projeto distroless usa a bazel criação do bazel do Google. No entanto, para instalar o Bazel e escrever suas próprias imagens, eu tive que suar (e para ser completamente honesto, reinventar a roda é divertido e informativo). Queria simplificar a criação de imagens reduzidas: o ato de criar uma imagem deve ser extremamente simples, banal . Para que você não tenha arquivos de configuração, apenas uma linha no console: <> .


Portanto, se você deseja criar suas próprias imagens, saiba: existe uma imagem de janela de encaixe única, scratch . Scratch é uma imagem "vazia", ​​não possui arquivos, embora pesa por padrão - uau! - 77 bytes.


 FROM scratch 

Imagem zero


A idéia de uma imagem de rascunho é que você pode copiar quaisquer dependências para ela da máquina host e usá-las dentro do Dockerfile (é como copiá-las para o apt e instalar a partir do zero) ou mais tarde, quando a imagem do Docker for materializada. Isso permite controlar totalmente o conteúdo do contêiner do Docker e, assim, controlar completamente o tamanho da imagem.


E agora precisamos, de alguma forma, coletar essas dependências. Ferramentas existentes, como o apt permitem baixar pacotes, mas estão vinculadas à máquina atual e, no final, não suportam Windows ou MacOS.


Por isso, comprometi-me a montar minha própria ferramenta, que montaria automaticamente a imagem básica do menor tamanho possível e, assim, ainda lançaria qualquer aplicativo. Eu usei pacotes Ubuntu / Debian, fiz uma seleção (obtendo pacotes diretamente dos repositórios) e encontrei recursivamente suas dependências. O programa deve baixar automaticamente a versão estável mais recente do pacote, minimizando os riscos de segurança.


Chamei a fetchy , porque ... encontra e traz ... o que você precisa [ do inglês. "buscar", "trazer" - aprox. trans. ] A ferramenta funciona através da interface da linha de comandos, mas ao mesmo tempo oferece uma API.


Para construir uma imagem usando o fetchy (vamos pegar uma imagem do Python desta vez), você só precisa usar a CLI assim: fetchy dockerize python . Você pode ser solicitado pelo sistema operacional de destino e pelo nome do código, pois o fetchy usa apenas pacotes baseados no Debian e Ubuntu até agora.


Agora você pode escolher quais dependências não são necessárias (no nosso contexto) e excluí-las. Por exemplo, o Python depende do perl, embora funcione muito bem sem o Perl instalado.


Resultados


A imagem Python criada com o fetchy dockerize python3.5 pesa apenas 35 MB (tenho mais certeza de que poderá ser ainda mais fácil no futuro). Acontece que, com uma imagem sem distração, conseguimos "raspar" outros 15 MB.


Todas as imagens coletadas atualmente podem ser visualizadas aqui .


O projeto está aqui .


Se você não tiver funções suficientes, basta criar um aplicativo - ficarei feliz em ajudar :) Ainda mais, atualmente estou trabalhando na integração de outros gerenciadores de pacotes ao fetchy, para que a necessidade de compilações em vários estágios não seja mais necessária.

Source: https://habr.com/ru/post/pt469947/


All Articles