Docker und Swift: Containerisierung von Anwendungen für iOS/macOS (Fortgeschrittenenniveau)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten
Here is the translated HTML content from Russian to German, with all HTML tags preserved and only the text content translated. Programming terms, code examples, and proper nouns remain in English. ```html

Docker und Swift: Containerisierung von Anwendungen für iOS/macOS (fortgeschrittenes Niveau)



Die Containerisierung von Swift-Anwendungen geht über das einfache Ausführen von „Hello, World!“ in Docker hinaus. Auf fortgeschrittenem Niveau stehen Entwickler vor Herausforderungen wie der Optimierung der Image-Größe, Multithreading, der Arbeit mit Netzwerk-Frameworks (SwiftNIO) und Webservern (Vapor). In diesem Artikel werden wir erläutern, wie man ein effizientes Docker-Image für ein Swift-Projekt mit mehrstufigem Build erstellt und einen Container für die Produktionsumgebung konfiguriert.



1. Mehrstufige Builds (Multi-stage builds) für Swift



Das Hauptproblem von Docker-Images für Swift ist ihre Größe. Ein vollständiges Image mit Kompilierungswerkzeugen kann über 2 GB wiegen. Die Lösung ist ein mehrstufiger Build. Die erste Stufe (build) kompiliert die Binärdatei, die zweite Stufe (runtime) enthält nur die ausführbare Datei und minimale Abhängigkeiten.



Beispiel Dockerfile für eine Server-Swift-Anwendung (z. B. Vapor):



# Stufe 1: BuildFROM swift:5.9-focal AS build

WORKDIR /app

COPY Package.swift Package.resolved ./RUN swift package resolve

COPY Sources ./SourcesRUN swift build -c release --static-swift-stdlib

# Stufe 2: Minimales ImageFROM ubuntu:22.04 AS runtime

RUN apt-get update && apt-get install -y libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY --from=build /app/.build/release/Run .

EXPOSE 8080CMD ["./Run"]


Wichtige Punkte:

  • --static-swift-stdlib — statisches Linken der Swift-Standardbibliothek, was die Abhängigkeiten von dynamischen Bibliotheken reduziert.
  • Nur die Release-Binärdatei kopieren — das endgültige Image wird auf ~100-150 MB reduziert.
  • Verwendung von Ubuntu 22.04 anstelle des vollständigen Swift-Images — Platzersparnis.


2. Optimierung von Layern und Caching von Abhängigkeiten



Docker cached Layer, daher ist die Reihenfolge der Anweisungen entscheidend. Bei Swift-Projekten ändern sich Abhängigkeiten (Package.swift, Package.resolved) seltener als der Quellcode. Trennen Sie das Kopieren von Manifesten und Quellcode:



COPY Package.swift Package.resolved ./RUN swift package resolve

COPY Sources ./SourcesRUN swift build -c release


Dies ermöglicht das Caching der Abhängigkeitsauflösung und vermeidet deren Neukompilierung bei jeder Codeänderung. Verwenden Sie --build-arg, um die Konfiguration für schnellere Builds auszuwählen:



docker build --build-arg CONFIGURATION=release -t my-swift-app .


Fügen Sie im Dockerfile hinzu:

ARG CONFIGURATION=releaseRUN swift build -c ${CONFIGURATION}


3. Containerisierung von SwiftNIO und Vapor: Netzwerkarbeit



Server-Swift-Anwendungen verwenden oft SwiftNIO für asynchrone Netzwerkarbeit. Im Container ist es wichtig, die Netzwerkumgebung richtig zu konfigurieren.



3.1. Konfiguration von Vapor in Docker



Vapor hört standardmäßig auf localhost:8080. Im Container muss 0.0.0.0 angegeben werden, um externe Verbindungen zu akzeptieren. Fügen Sie in configure.swift hinzu:



app.http.server.configuration.hostname = "0.0.0.0"app.http.server.configuration.port = 8080


Oder verwenden Sie Umgebungsvariablen:

docker run -e HOST=0.0.0.0 -e PORT=8080 -p 8080:8080 my-swift-app


3.2. SwiftNIO und Healthcheck



Fügen Sie für das Produktions-Monitoring einen Healthcheck im Dockerfile hinzu:



HEALTHCHECK --interval=30s --timeout=3s --retries=3 \  CMD curl -f http://localhost:8080/health || exit 1


Implementieren Sie im SwiftNIO-Code den Endpunkt /health:



func healthHandler(request: Request) -> EventLoopFuture<String> {    return request.eventLoop.makeSucceededFuture("OK")}


4. Fortgeschrittene Techniken: Docker Compose und Multi-Plattform-Builds



4.1. Docker Compose für Swift-Backend



Wenn ```

Blogs

Buchempfehlungen