Multistage Build
O Multistage Build, ou construção em múltiplos estágios, é um conceito fundamental no Docker, especialmente quando se trata de otimização e redução do tamanho das imagens. Ele permite dividir o processo de construção da imagem em várias etapas, o que pode resultar em imagens mais leves e eficientes.
O objetivo principal do Multistage Build é resolver o problema de incluir itens desnecessários nas imagens de produção. Muitas vezes, durante o processo de construção de uma aplicação, são necessárias ferramentas ou dependências adicionais que não são relevantes para a execução da aplicação em si. Esses itens podem aumentar desnecessariamente o tamanho da imagem, tornando-a mais pesada e consumindo mais recursos.
Com o Multistage Build, é possível criar estágios separados para diferentes partes do processo de construção, como compilação, testes e execução. Cada estágio pode ter suas próprias dependências e ferramentas específicas, garantindo que apenas o necessário seja incluído na imagem final.
No contexto do Docker, um estágio é definido com a instrução FROM
, que especifica a imagem base para aquele estágio. Por exemplo, um estágio de compilação pode usar uma imagem com todas as ferramentas necessárias para compilar o código-fonte da aplicação, enquanto um estágio de execução pode usar uma imagem mais leve, contendo apenas o ambiente de tempo de execução necessário para rodar a aplicação.
Um benefício adicional do Multistage Build é que o Docker pode otimizar o processo de construção, reutilizando camadas comuns entre os estágios. Isso significa que apenas as diferenças entre os estágios são adicionadas à imagem final, reduzindo ainda mais o tamanho e o tempo de construção.
FROM node:18-alpine3.19 AS build
WORKDIR /usr/src/app
COPY package.json yarn.lock .yarnrc.yml ./
COPY .yarn ./.yarn
RUN yarn
COPY . .
RUN yarn run build
FROM node:18-alpine3.19
COPY --from=build /usr/src/app/dist ./dist
COPY --from=build /usr/src/app/node_modules ./node_modules
EXPOSE 3000
CMD ["yarn", "run", "start"]
No exemplo acima, o Multistage Build é usado para dividir o processo de construção da imagem em dois estágios: um para construir a aplicação e outro para executá-la. Isso resulta em uma imagem final significativamente menor, pois apenas os artefatos necessários para a execução da aplicação são incluídos.