Introducción a Docker y Swift: ¿Por qué es importante?
En el desarrollo de software moderno, la contenedorización se ha convertido en el estándar de facto para garantizar la reproducibilidad, escalabilidad y facilidad de implementación de las aplicaciones. Si desarrollas en Swift para iOS o macOS, probablemente estés acostumbrado al ecosistema de Xcode y Package Manager. Sin embargo, cuando se trata del lado del servidor (Swift on Server) o de crear entornos aislados para compilación y pruebas, Docker se convierte en una herramienta indispensable.
En este artículo, analizaremos cómo contenerizar aplicaciones Swift con Docker. Aprenderás a crear un Dockerfile para Swift, configurar el entorno para el framework de servidor Vapor y optimizar el proceso de compilación. El material será útil tanto para desarrolladores iOS que estudian backend como para ingenieros DevOps que trabajan con Swift.
Fundamentos de Docker para el desarrollador Swift
Docker permite empaquetar una aplicación junto con todas sus dependencias en un contenedor ligero. Para Swift, esto es especialmente relevante, ya que el compilador y las bibliotecas pueden variar según la versión del sistema operativo. En lugar de configurar el servidor manualmente, simplemente ejecutas un contenedor.
Instalación de Docker y Swift SDK
Lo primero es asegurarte de tener Docker instalado. Luego necesitarás una imagen de Swift. La imagen oficial de Apple está disponible en Docker Hub:
docker pull swift:5.9Esta imagen incluye el compilador Swift, Package Manager y utilidades básicas. Puedes usarla tanto para compilar como para ejecutar aplicaciones.
Creación de una aplicación Swift simple
Creemos una aplicación de consola mínima:
// main.swiftprint("Hello, Docker with Swift!")Inicializamos el proyecto:
mkdir MySwiftApp && cd MySwiftAppswift package init --type executableEscribiendo un Dockerfile para Swift
Ahora crearemos un Dockerfile en la raíz del proyecto. Es importante usar una compilación multi-etapa (multi-stage build) para que la imagen final sea mínima.
# Primera etapa: compilaciónFROM swift:5.9 AS buildWORKDIR /appCOPY Package.swift Package.resolved ./RUN swift package resolveCOPY . .RUN swift build -c release --static-swift-stdlib
# Segunda etapa: ejecuciónFROM ubuntu:22.04WORKDIR /appCOPY --from=build /app/.build/release/MySwiftApp .CMD ["./MySwiftApp"]Explicación:
- --static-swift-stdlib — enlace estático de la biblioteca estándar de Swift para no incluir libswift.so en la imagen.
- COPY Package.swift por separado — almacenamiento en caché de dependencias por Docker.
- Ubuntu 22.04 — base ligera para el runtime.
Compila y ejecuta:
docker build -t my-swift-app .docker run --rm my-swift-appContenerización de una aplicación Vapor
El framework Vapor es la opción más popular para Swift del lado del servidor. Veamos un Dockerfile para un proyecto Vapor típico.
Estructura del proyecto Vapor
Supongamos que tienes un proyecto creado con vapor new MyVaporApp. El Dockerfile será más complejo, ya que hay que considerar el trabajo con la red y la base de datos.
# Etapa de compilaciónFROM 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
# Etapa de ejecuciónFROM 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"]Puntos importantes:
- libsqlite3-dev —