Sobes.tech
Middle

Quais são os principais métodos de otimização de imagens em DevOps?

sobes.tech IA

Resposta da IA

A otimização das imagens de contêiner é importante para acelerar a implantação, reduzir o consumo de recursos e diminuir o vetor de ataque. Métodos principais:

  • Construção em múltiplas etapas (Multi-stage builds): Uso de várias instruções FROM no Dockerfile. Nas etapas intermediárias, são criados artefatos (código compilado, bibliotecas), que depois são copiados para a imagem final, mínima. Isso permite excluir ferramentas de compilação e dependências que só são necessárias na fase de compilação.

    // Etapa 1: Etapa de construção
    FROM golang:1.20 as builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp
    
    // Etapa 2: Etapa final
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/myapp /usr/local/bin/
    CMD ["myapp"]
    
  • Uso de imagens base mínimas: Seleção de imagens base leves, como Alpine, scratch ou distribuições sem ferramentas e bibliotecas pré-instaladas, para minimizar tamanho e vulnerabilidades potenciais.

  • Excluir arquivos desnecessários: Uso do arquivo .dockerignore para evitar copiar arquivos que não são necessários para a operação da aplicação (código fonte, testes, arquivos de controle de versão, arquivos temporários).

  • Cache de camadas (Layer caching): Docker armazena em cache cada camada da imagem. É recomendável colocar instruções que mudam raramente no início do Dockerfile. As instruções que mudam com mais frequência (como adicionar código da aplicação) devem ser colocadas mais adiante.

    FROM ubuntu:latest
    
    // Instruções que mudam raramente
    RUN apt-get update && apt-get install -y --no-install-recommends \
        nginx \
        supervisor \
        && rm -rf /var/lib/apt/lists/*
    
    // Instruções que mudam com mais frequência (por exemplo, copiar código)
    COPY myapp /app
    WORKDIR /app
    
  • Unificação de instruções RUN: Minimizar o número de camadas combinando várias comandos em uma única instrução RUN usando &&.

    // Não otimizado
    RUN apt-get update
    RUN apt-get install -y mylib1
    RUN apt-get install -y mylib2
    
    // Otimizado
    RUN apt-get update && apt-get install -y --no-install-recommends mylib1 mylib2 && rm -rf /var/lib/apt/lists/*
    
  • Remoção de arquivos temporários: Limpeza do cache do gerenciador de pacotes e remoção de arquivos temporários após a instalação de dependências em uma única instrução RUN.

  • Otimização da ordem das instruções: Colocar comandos COPY ou ADD para arquivos que mudam frequentemente mais perto do final do Dockerfile para aproveitar ao máximo o cache das camadas anteriores.

  • Escaneamento de vulnerabilidades: Uso de ferramentas como Trivy, Clair ou Anchore para identificar vulnerabilidades na imagem.

  • Assinatura de imagens: Uso de Notary ou Cosign para garantir a integridade e autenticidade das imagens.

  • Uso de ferramentas para reduzir o tamanho da imagem: Como DockerSlim ou Dive para analisar e otimizar o conteúdo da imagem.

Estas técnicas, aplicadas em conjunto, permitem reduzir significativamente o tamanho das imagens, melhorar a segurança e acelerar o pipeline de CI/CD.