Swift und Kitura mit Docker ausprobieren

Vor ca. einem halben Jahr habe ich hier darüber lamentiert, dass es noch immer keine ordentlichen Paket-Repos für die Linux-Variante von Swift gibt. Daran hat sich bis heute nichts geändert. Deswegen möchte ich hier auf einen anderen Weg hinweisen, wie Sie Swift unter Linux unkompliziert zum Laufen bringen können: Docker.

Docker ist ein Framework, um Container unter Linux, macOS und Linux auszuführen. Container sind eine Verpackungsform von zumeist auf Linux basierende Anwendungen. Derartige Anwendungen können von einer simplen Shell-Umgebung über einen Web-Server bis hin zu einem kompletten Content Management System reichen.

Docker installieren

Die erste Voraussetzung ist natürlich die Installation von Docker auf der Linux-Distribution Ihrer Wahl oder auf macOS. (Windows wird auch unterstützt, diese Variante habe ich aber nicht getestet.)

Unter CentOS gehen Sie so vor:

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
sytemctl enable docker
sytemctl start docker

Ganz ähnlich ist die Vorgehensweise unter Fedora:

dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
dnf makecache fast
dnf -y install docker-ce
sytemctl enable docker
sytemctl start docker

Unter Ubuntu führen Sie diese Kommandos aus:

apt-get -y install apt-transport-https ca-certificates curl
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
sudo add-apt-repository \
 "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable"
apt update && apt -y install docker-ce

Nach der Installation können Sie sich mit docker version vergewissern, dass alles geklappt hat:

docker version

  Client:
    Version:      17.03.0-ce
    API version:  1.26
    ...
  Server:
    Version:      17.03.0-ce
    ...

Installationsanleitungen für andere Linux-Distributionen, für macOS und Windows sowie für die Cloud (AWS und Azure) finden Sie hier:

https://store.docker.com/search?offering=community&type=edition

Swift für Linux unter Docker ausführen

Docker stellt in seinem Image-Katalog auf https://hub.docker.com ein offizielles und erfreulich gut dokumentiertes Image für Swift zur Verfügung. Es basiert auf Ubuntu 16.04. Details können Sie hier nachlesen.

Um den Swift-Kommandointerpreter als Docker-Container auszuführen, geben Sie das folgende Kommando ein:

docker run --cap-add sys_ptrace -it --rm swift swift

Welcome to Swift version 3.0.2 (swift-3.0.2-RELEASE). 
Type :help for assistance.
  1> let s="Hello World"
s: String = "Hello World"
  2> print(s)
Hello World
  3> :exit

Bei der ersten Ausführung wird das rund 1 GByte große Docker-Linux-Image heruntergeladen. (Alle Images und die davon abgeleiteten Container werden in /var/lib/docker gespeichert. Sie können bei Bedarf mit docker rm containername bzw. docker rmi imagename wieder gelöscht werden.)

Das erstmalige Herunterladen des Images dauert natürlich geraume Zeit. In der Folge wird docker run aber blitzschnell ausgeführt. Es startet einen auf diesem Image basierenden Container und führt darin das Kommando swift aus. Im Interpreter können Sie nun Swift ausprobieren. Sobald Sie den Interpreter mit dem Kommando :exit beenden, wird der Container wieder gelöscht (Option --rm). Die Option --cap-add sys_ptrace ist notwendig, weil Swift ptrace-Funktionen zum Debugging benötigt. Der Container bekommt daher die Erlaubnis, diese Funktionen zu nutzen.

Um unter Swift für Linux eigene Programme zu kompilieren und zu speichern, richten Sie einen dauerhaften Container ein. --name legt den Namen für den Container fest, -h stellt den Hostnamen ein, -it ermöglicht die interaktive Nutzung. Beim ersten Start soll im Container die Shell bash ausgeführt werden:

docker run -it --name swifttest -h swifttest swift bash

root@swifttest#  cat /etc/os-release

  NAME="Ubuntu"
  VERSION="16.04.2 LTS (Xenial Xerus)"

root@swifttest#  swift -version

  Swift version 3.0.2 (swift-3.0.2-RELEASE)
  Target: x86_64-unknown-linux-gnu

root@swifttest#  exit

Jeder weitere Start des Containers erfolgt mit docker start -i swifttest. Sie können nun Swift-Code verfassen, kompilieren und ausführen. Bei Bedarf installieren Sie mit apt-get install den Editor Ihrer Wahl.

docker start -i swifttest

echo 'print("Hello World!")' > hello-world.swift
swiftc hello-world.swift -o hello-world
./hello-world 

  Hello World!

Kitura-Einführungsbeispiel unter Docker ausführen

Apple träumt davon, dass Linux für Swift bei der Server-seitigen Programmierung Fuß fasst — also alles aus einem Guss, von der App bis zum Backend. Tatsächlich gibt es bereits mehrere Web-Frameworks. Am bekanntesten ist das von IBM entwickelte Framework Kitura. Auch für Kitura gibt es ein fertiges Docker-Image. Es basiert unerklärlicherweise noch auf Ubuntu 14.04, was aber für den Einsatzzweck — das Ausprobieren von Swift mit Kitura — nicht wirklich eine Einschränkung ist.

Den erforderlichen Docker-Container richten Sie wie folgt ein:

docker run -it -p 8080:8080 -h kituratest --name kituratest ibmcom/kitura-ubuntu:latest /bin/bash

Vor dem erstmaligen Start ist abermals ein Download von ca. 1 GByte erforderlich. Die Option -p verbindet den Port 8080 des Containers mit dem Port 8080 des Docker-Hostrechners.

Weitere Starts erfolgen dann mit docker start:

docker start -i kituratest

Innerhalb des Containers ist im Verzeichnis Kitura-Test schon alles vorbereitet, um die Kitura-Beispiel-App in Betrieb zu nehmen. Sie müssen den Code nur noch kompilieren und starten:

cd Kitura-Starter
swift build
.build/debug/Kitura-Starter

   ... Server will be started on 'http://localhost:8080'. ...

Auf dem Hostrechner können Sie jetzt in einem Webbrowser über die Adresse http:localhost:8080 den auf Swift-Code basierenden Server ausprobieren.

Der Webserver basiert auf der Programmiersprache Swift und dem Kitura-Framework von IBM. Er läuft in einem Docker-Container mit Ubuntu 14.04. Als Docker-Host kam Fedora 25 zum Einsatz.

Quellen