Introducao

O Docker revolucionou a forma como desenvolvemos, empacotamos e implantamos aplicacoes. Ele fornece um ambiente consistente para as aplicacoes rodarem, do desenvolvimento a producao, reduzindo o problema do "funciona na minha maquina". Um dos recursos mais poderosos que o Docker introduziu sao os multi-stage builds. Este recurso nos ajuda a criar containers enxutos e eficientes sem a complicacao habitual. Neste post, vamos mergulhar nos Docker multi-stage builds, seus beneficios e melhores praticas. Tambem forneceremos um Dockerfile de exemplo para ilustrar o conceito.

O que e Docker Multi-Stage Build?

Docker multi-stage build e um recurso que permite usar varias instrucoes FROM no seu Dockerfile. Cada instrucao FROM pode usar uma imagem base diferente e inicia um novo estagio do build. Voce pode copiar seletivamente artefatos de um estagio para outro, deixando para tras tudo o que voce nao precisa na imagem final. Isso permite criar imagens menores e mais eficientes separando os processos de build e empacotamento em estagios diferentes.

Por que Usar Docker Multi-Stage Builds?

Antes da introducao dos multi-stage builds, criar imagens Docker enxutas era um pouco problematico. Voce precisava criar Dockerfiles separados para build e execucao de aplicacoes, ou instalar ferramentas desnecessarias em suas imagens de producao. Os multi-stage builds resolvem esses problemas permitindo que voce use um unico Dockerfile para criar imagens eficientes. Aqui estao algumas razoes pelas quais voce deve usar Docker multi-stage builds:

  1. Tamanho de Imagem Menor: Ao copiar apenas os arquivos necessarios do estagio de build para a imagem final, voce pode reduzir significativamente o tamanho das suas imagens Docker. Imagens menores sao mais rapidas para push e pull de registries e usam menos espaco em disco.
  2. Separacao de Responsabilidades: Com multi-stage builds, voce pode separar as dependencias de build das dependencias de runtime. Isso torna seu Dockerfile mais facil de ler e manter.
  3. Seguranca: Imagens menores tem uma superficie de ataque menor. Ao excluir ferramentas e arquivos desnecessarios, voce reduz o potencial de vulnerabilidades de seguranca.

Melhores Praticas

  1. Use Imagens Base Especificas: Para cada estagio, use a imagem base mais especifica que inclui apenas o que voce precisa para aquele estagio. Por exemplo, use uma imagem Node.js para um estagio de build que envolve uma aplicacao Node.js, e uma imagem Alpine para um estagio final leve.
  2. Otimize a Criacao de Camadas: O Docker constroi imagens em camadas. Para tornar seus builds mais rapidos e suas imagens menores, tente minimizar o numero de camadas combinando comandos usando &&.
  3. Limpe Depois de Voce: No estagio de build, limpe arquivos e artefatos desnecessarios apos terminar de usa-los. Isso tornara o cache de build menor e mais rapido.

Dockerfile de Exemplo

Aqui esta um Dockerfile de exemplo que demonstra um multi-stage build para uma aplicacao Node.js:

Dockerfile

—- Base Node —-

FROM node:14 AS base WORKDIR /usr/src/app COPY package*.json ./

—- Dependencies —-

FROM base AS dependencies RUN npm install

—- Test —-

executa linters, setup e testes

FROM dependencies AS test COPY . . RUN npm run test

—- Build —-

FROM dependencies AS build COPY . . RUN npm run build

—- Release —-

FROM node:14-alpine AS release WORKDIR /usr/src/app COPY –from=build /usr/src/app/dist ./dist EXPOSE 8080 CMD [“node”, “dist/index.js”]

Neste Dockerfile, temos cinco estagios: base, dependencies, test, build e release. O estagio base copia os arquivos package.json. O estagio dependencies instala os modulos Node. O estagio test executa os testes. O estagio build compila a aplicacao. Por fim, o estagio release cria a imagem final que sera usada em producao. Apenas os arquivos necessarios sao copiados para a imagem final, resultando em uma imagem menor e mais eficiente.

Conclusao

Docker multi-stage builds sao uma ferramenta poderosa para criar imagens Docker eficientes. Eles permitem separar seus ambientes de build e runtime, reduzir o tamanho da imagem e melhorar a seguranca. Seguindo as melhores praticas e usando um Dockerfile bem estruturado, voce pode aproveitar ao maximo este recurso. Boas aventuras com Docker!