Um Dockerfile é um arquivo de texto que contém todas as instruções necessárias para criar uma imagem Docker. Pense nele como uma receita que o Docker usa para "cozinhar" sua aplicação em um container.
Características Principais
Formato texto simples
Execução sequencial de instruções
Sistema de camadas (layers)
Cache inteligente
Sintaxe declarativa
Por que usar Dockerfile?
Automação da criação de imagens
Reprodutibilidade
Versionamento
Padronização
Facilidade de compartilhamento
Anatomia Básica 🔬
Estrutura Fundamental
# Comentário explicativo
FROM ubuntu:20.04
# Variáveis de ambiente
ENV APP_HOME=/app \
APP_ENV=production
# Diretório de trabalho
WORKDIR $APP_HOME
# Copiar arquivos
COPY . .
# Executar comandos
RUN apt-get update && \
apt-get install -y python3
# Expor portas
EXPOSE 8080
# Comando padrão
CMD ["python3", "app.py"]
Instruções Essenciais 📝
FROM
A instrução FROM é sempre a primeira instrução válida em um Dockerfile.
# Imagem base oficial
FROM node:18-alpine
# Imagem scratch (vazia)
FROM scratch
# Multi-stage build
FROM golang:1.19 AS builder
ARG
ARG é a única instrução que pode vir antes de FROM.
# Definir versão durante o build
ARG NODE_VERSION=18
FROM node:${NODE_VERSION}-alpine
# Múltiplos argumentos
ARG BUILD_ENV
ARG BUILD_VERSION
ENV
Variáveis de ambiente que persistem na imagem final.
# ❌ Ruim - Muitas camadas
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y nginx
RUN rm -rf /var/lib/apt/lists/*
# ✅ Bom - Uma única camada
RUN apt-get update && \
apt-get install -y \
python3 \
nginx \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
2. Cache Eficiente
# ✅ Copiar apenas arquivos de dependência primeiro
COPY package*.json ./
RUN npm ci
# Copiar código-fonte depois
COPY . .
RUN npm run build
# ✅ Agrupar comandos relacionados
RUN curl -sL https://example.com/setup.sh | bash - && \
apt-get update && \
apt-get install -y package1 package2 && \
rm -rf /var/lib/apt/lists/*
3. Multi-stage Builds Avançados
# Stage de build
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage de testes
FROM builder AS tester
RUN npm run test
# Stage final
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
4. Segurança
# Usar versões específicas
FROM node:18.17.1-alpine3.18
# Criar e usar usuário não-root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# Minimizar superfície de ataque
FROM alpine:3.18
RUN apk add --no-cache nodejs
Padrões Avançados 🎯
1. Imagens Base Personalizadas
# Dockerfile.base
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y \
curl \
nginx \
&& rm -rf /var/lib/apt/lists/*
# Dockerfile
FROM myorg/baseimage:1.0
COPY . .
# Build stage
FROM node:18-alpine AS frontend-builder
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ .
RUN npm run build
# Backend stage
FROM golang:1.19-alpine AS backend-builder
WORKDIR /app
COPY backend/go.* ./
RUN go mod download
COPY backend/ .
RUN CGO_ENABLED=0 go build -o api
# Final stage
FROM alpine:3.18
RUN apk add --no-cache ca-certificates nginx
COPY --from=frontend-builder /app/dist /usr/share/nginx/html
COPY --from=backend-builder /app/api /usr/local/bin/
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Microserviço com Cache
FROM golang:1.19-alpine AS builder
# Cache go modules
COPY go.mod go.sum ./
RUN go mod download
# Build app with version info
ARG VERSION
ARG BUILD_DATE
RUN --mount=type=cache,target=/root/.cache/go-build \
go build -ldflags="-X main.Version=${VERSION} -X main.BuildDate=${BUILD_DATE}" \
-o /app
FROM alpine:3.18
COPY --from=builder /app /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/app"]