# Introdução

Um **Multi-stage build** no Docker é uma técnica que permite construir imagens Docker mais eficientes e otimizadas. Ele funciona ao dividir o processo de construção em várias etapas, onde apenas os artefatos necessários são copiados para a imagem final. Isso reduz o tamanho da imagem e melhora a segurança, pois remove as partes desnecessárias usadas durante a construção, como ferramentas de compilação.

#### Benefícios do Multi-stage Build

* **Redução do Tamanho da Imagem:** Apenas os arquivos necessários são incluídos na imagem final.
* **Melhor Segurança:** Ferramentas de desenvolvimento e outros componentes não são incluídos na imagem final.
* **Facilidade de Manutenção:** O Dockerfile permanece limpo e modular, facilitando a leitura e a manutenção.

#### Exemplo de Multi-stage Build

Vamos considerar um exemplo simples de uma aplicação Go. No primeiro estágio, compilamos a aplicação. No segundo estágio, copiamos apenas o binário compilado para a imagem final.

**Dockerfile com Multi-stage Build**

```Dockerfile
# Etapa 1: Construção
FROM golang:1.20-alpine AS build

# Definir o diretório de trabalho dentro do container
WORKDIR /app

# Copiar os arquivos de código para o container
COPY . .

# Compilar a aplicação Go
RUN go build -o myapp

# Etapa 2: Imagem final
FROM alpine:latest

# Definir o diretório de trabalho dentro do container final
WORKDIR /root/

# Copiar apenas o binário compilado da etapa anterior
COPY --from=build /app/myapp .

# Executar o binário quando o container iniciar
CMD ["./myapp"]
```

#### Como Funciona

1. **Primeiro Estágio (`build`):**
   * Usa uma imagem do Golang para compilar a aplicação.
   * Copia o código-fonte para o diretório de trabalho `/app` e compila a aplicação.
   * O resultado é um binário chamado `myapp`.
2. **Segundo Estágio (Imagem Final):**
   * Usa uma imagem base minimalista (`alpine`).
   * Copia apenas o binário compilado do primeiro estágio para a imagem final.
   * Define o comando para executar o binário quando o container é iniciado.

#### Construção da Imagem

Para construir a imagem com o Dockerfile acima:

```bash
docker build -t myapp .
```

#### Verificação

Para verificar o tamanho da imagem e garantir que apenas o necessário foi incluído:

```bash
docker image ls myapp
```

Isso demonstra como o Multi-stage build permite criar imagens Docker menores e mais seguras, removendo as partes não necessárias do processo de construção. Essa técnica é particularmente útil para aplicações que exigem um processo de compilação complexo ou múltiplas dependências.

## Laboratório

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2FOOZodqrOhGdJRYIsTCAh%2Fimage.png?alt=media&#x26;token=c1a0f2bd-c66f-41df-91a7-f60ebb854a52" alt=""><figcaption></figcaption></figure>

Tipos de Linguagens:

* Interpretadas
* Compiladas
* Interpretadas e Compiladas

### Linguagem Interpretada

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2Fn0BLKcxKgLsgaOrKNM0r%2Fimage.png?alt=media&#x26;token=08988d5f-2548-46c0-be1c-8687a167be53" alt=""><figcaption></figcaption></figure>

### Linguagem Compilada

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2FmZuaUJMnYG1MLt51gAhS%2Fimage.png?alt=media&#x26;token=97529a6c-5310-4aab-9954-0b402b3fae4c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2FQ8UM1xhypZNEmXf0yIQL%2Fimage.png?alt=media&#x26;token=48f15ebc-9470-404a-81a2-3d89cd8abb16" alt=""><figcaption></figcaption></figure>

### Linguagem Compilada e Interpretada (Híbrida)

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2FC3NQDBsDgnplXW2lNmkb%2Fimage.png?alt=media&#x26;token=5ca122c2-4f25-4dd7-a56b-08e6a6d3807c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2Fi4Pg10jCXAV6hOMOWNfy%2Fimage.png?alt=media&#x26;token=b6eebcb0-6c8a-47cc-bf1c-4388d8af4261" alt=""><figcaption></figcaption></figure>

### Frontend

<figure><img src="https://2056950903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7JJDMtYZqFc5W4Gd6mo1%2Fuploads%2FAgjx4RWX40S8inyOupCf%2Fimage.png?alt=media&#x26;token=a13f74cc-402d-455e-b001-bfa0a1ae3796" alt=""><figcaption></figcaption></figure>
