Introdução ao Docker e Swift: Por que isso é importante?
No desenvolvimento de software moderno, a conteinerização tornou-se o padrão de facto para garantir reprodutibilidade, escalabilidade e facilidade de implantação de aplicações. Se você desenvolve em Swift para iOS ou macOS, provavelmente está acostumado com o ecossistema do Xcode e do Package Manager. No entanto, quando se trata de backend (Swift on Server) ou de criar ambientes isolados para compilação e teste, o Docker torna-se uma ferramenta indispensável.
Neste artigo, vamos detalhar como conteinerizar aplicações Swift usando Docker. Você aprenderá a criar um Dockerfile para Swift, configurar o ambiente para o framework de servidor Vapor e otimizar o processo de compilação. O material será útil tanto para desenvolvedores iOS que estão aprendendo backend quanto para engenheiros DevOps que trabalham com Swift.
Fundamentos do Docker para o desenvolvedor Swift
O Docker permite empacotar uma aplicação junto com todas as suas dependências em um contêiner leve. Para Swift, isso é especialmente relevante, pois o compilador e as bibliotecas podem variar dependendo da versão do SO. Em vez de configurar um servidor manualmente, você simplesmente executa um contêiner.
Instalação do Docker e do Swift SDK
Primeiramente, certifique-se de ter o Docker instalado. Em seguida, você precisará de uma imagem Swift. A imagem oficial da Apple está disponível no Docker Hub:
docker pull swift:5.9Esta imagem inclui o compilador Swift, o Package Manager e utilitários básicos. Você pode usá-la tanto para compilar quanto para executar aplicações.
Criação de uma aplicação Swift simples
Vamos criar uma aplicação de console mínima:
// main.swiftprint("Hello, Docker with Swift!")Inicializamos o projeto:
mkdir MySwiftApp && cd MySwiftAppswift package init --type executableEscrevendo um Dockerfile para Swift
Agora, crie um Dockerfile na raiz do projeto. É importante usar a compilação em múltiplos estágios (multi-stage build) para que a imagem final seja mínima.
# Primeiro estágio: compilaçãoFROM swift:5.9 AS buildWORKDIR /appCOPY Package.swift Package.resolved ./RUN swift package resolveCOPY . .RUN swift build -c release --static-swift-stdlib
# Segundo estágio: execuçãoFROM ubuntu:22.04WORKDIR /appCOPY --from=build /app/.build/release/MySwiftApp .CMD ["./MySwiftApp"]Explicação:
- --static-swift-stdlib — vinculação estática da biblioteca padrão do Swift para não carregar o libswift.so na imagem.
- COPY Package.swift separadamente — cache das dependências pelo Docker.
- Ubuntu 22.04 — base leve para o runtime.
Compile e execute:
docker build -t my-swift-app .docker run --rm my-swift-appConteinerização de uma aplicação Vapor
O framework Vapor é a escolha mais popular para Swift no servidor. Vamos considerar um Dockerfile para um projeto Vapor típico.
Estrutura do projeto Vapor
Suponha que você tenha um projeto criado com vapor new MyVaporApp. O Dockerfile será mais complexo, pois é preciso considerar a rede e o banco de dados.
# Estágio de compilaçãoFROM swift:5.9 AS buildRUN apt-get update && apt-get install -y libsqlite3-devWORKDIR /appCOPY Package.swift Package.resolved ./RUN swift package resolveCOPY . .RUN swift build -c release
# Estágio de execuçãoFROM swift:5.9-slimWORKDIR /appCOPY --from=build /app/.build/release/MyVaporApp .COPY --from=build /app/Public ./PublicCOPY --from=build /app/Resources ./ResourcesEXPOSE 8080CMD ["./MyVaporApp", "serve", "--hostname", "0.0.0.0", "--port", "8080"]Pontos importantes:
- libsqlite3-dev —