... oder wie Sie Docker in Ihre Lieblings-IDE integrieren

Eclipse + Docker = doclipser

Mario Loriedo

Docker hat zuletzt eine große Aufmerksamkeit erhalten – und es ist keine Überraschung, dass viele Entwickler Docker-Integrationen in ihren Tools fordern. Dieser Artikel stellt doclipser vor, ein Plug-in, das bei Zenika entwickelt wurde, um einen vollständigen Docker-Support in der Eclipse-IDE bereitzustellen.

Bevor wir in die Details zu doclipser einsteigen, wollen wir kurz fragen, warum Docker eigentlich ein so nützliches Entwicklungstool ist. Wie können wir von Docker profitieren, um Entwicklungsumgebungen aufzusetzen und effektiv zu nutzen? Nun, es gibt nicht nur einen Weg zu diesem Ziel, und so wollen wir uns zunächst zwei interessante Use Cases anschauen.

Build-System

Der erste Use Case besteht darin, Docker als Build-Werkzeug einzusetzen. Docker erlaubt es uns, Build-Umgebungen portabel, isoliert und reproduzierbar zu machen. Stellen wir uns einmal ein C-Quellcode-File vor: hello.c. Wenn man für den Build etwa den GCC-Compiler in Version 5.1 benötigt, ist bei installiertem Docker lediglich das folgende Kommando nötig:

docker run gcc:5.1 gcc -o helloworld helloword.c

Diese Anweisung kann man überall ausführen, ohne sich um Libraries, Versionskonflikte oder die Installation von GCC 5.1 zu kümmern. Und man kann sicher sein: Wenn alles auf dem Laptop läuft, funktioniert es auch auf dem Integrationsserver.

Laufzeitumgebung

Der zweite Use Case ist die Nutzung von Docker als Runtime-Plattform. Wenn man beispielsweise eine Java-Webapplikation (HelloWorld.war) mit Version 8 von Tomcat starten möchte, genügt die folgende Anweisung:

docker run tomcat:8 \
    -v HelloWorld.war:/usr/local/tomcat/webapps/Helloworld.war

Auch hier muss man sich nicht mit Abhängigkeiten, Plattformkonfigurationen oder etwaigen Unterschieden in Linux-Distributionen herumplagen. Es funktioniert einfach.

Docker und IDEs: doclipser

Es sollte klar geworden sein, wie Docker als Entwicklungswerkzeug nützlich sein kann. Das zeigten schon unsere kleinen Shell-Kommandobeispiele. Doch wir können noch weiter gehen. Wir könnten Docker-Container direkt aus der IDE heraus starten, wir könnten Docker direkt in Eclipse integrieren. Und genau das tun wir mit doclipser.

doclipser ist ein Eclipse-Plug-in, das wir Anfang dieses Jahres mit dem Ziel entwickelt haben, Docker-Container mittels Dockerfiles, die in den Projektquelldateien enthalten sind, von der IDE heraus editieren und starten zu können. Schauen wir uns nun an, wie sich doclipser installieren, nutzen und konfigurieren lässt.

Installation

Um doclipser zu installieren, folgen Sie einfach dem üblichen Eclipse-Plug-in-Installationsvorgang über die Updatesite. Sobald die Installation beendet ist, sollten die folgenden zwei neuen Features zu sehen sein (Abb. 1):

Doclipser - Dockerfile Editor
Doclipser - Docker API client
Abb. 1: Doclipser-Features

Abb. 1: Doclipser-Features

Das Editieren von Dockerfiles

Das erste Feature von doclipser ist der Support für Dockerfiles. Wenn Sie noch nicht mit Docker vertraut sind: Diese Dateien werden genutzt, um Docker-Images zu erzeugen. Sie beinhalten alle Instruktionen, um ein Docker-Image aufzubauen, etwa das Installieren der Packages, das Erzeugen von User, die Bereitstellung von Ports etc.

Dockerfiles nutzen eine spezifische DSL. In doclipser kommt das Xtext-Framework zum Einsatz, um die Grammatik von Dockerfiles festzulegen. Der Dockerfile-Support beinhaltet Syntax Highlighting, Autovervollständigung und Syntaxüberprüfung (Abb. 2 bis 4).

Abb. 2: Dockerfile-Syntaxvalidierung

Abb. 2: Dockerfile-Syntaxvalidierung

Abb. 3: Dockerfile Autocomplete

Abb. 3: Dockerfile Autocomplete

Abb. 4: Dockerfile Syntax Highlighting

Abb. 4: Dockerfile Syntax Highlighting

Das Starten von Containern

Ein anderes nützliches Feature von doclipser ist die Fähigkeit, Docker-Container aus dem Eclipse-UI heraus zu starten. Wenn wir ein Dockerfile editieren, sind eine Reihe von Docker-Kommandos im „Run As“-Menü verfügbar (Abb. 5). Im Einzelnen sind dies:

Abb. 5: Verfügbare Docker-Anweisungen im Eclipse-Menü

Abb. 5: Verfügbare Docker-Anweisungen im Eclipse-Menü

  • Docker Build: Nutzen Sie docker build mit dem Ordner als Build-Kontext, der die Dockerfiles enthält. Das Ergebnis ist ein Docker-Image im Namensformat <project>_<folder>.
  • Docker Run: Führt eine Docker-Build-Anweisung aus, die das Image erzeugt, gefolgt von einem Docker Run, das einen Container auf Basis des gerade erstellten Images generiert und startet. Das Namensformat des Containers ist: <project>_<folder>_<n>.
  • Docker Logs: Zeigt die Logs eines Docker-Containers an, der von doclipser gestartet wurde. Es werden keine Logs angezeigt, bis der Container via doclipser gelauncht wird.
  • Docker Ps: Zeigt eine Liste der aktuell laufenden Container. Gestoppte Container werden nicht angezeigt.
  • Docker Rm: Entfernt einen Docker-Container, der vorher mit doclipser gestartet wurde.

Konfiguration

Das doclipser-Konfigurationsfile kann unter <eclipse-installation-path>/ com.zenika.docker.api_<version>/docker.properties gefunden werden (Abb. 6). Wird doclipser unter Linux gestartet und ist Docker auf demselben Host installiert, so muss die Konfigurationsdatei nicht verändert werden: Die Default-Einstellungen sollten funktionieren.

Wenn Docker aber auf einem Remote-Host oder einem Windows-/OS-X-Host betrieben wird, müssen die Properties angepasst werden, da doclipser sonst nicht in der Lage ist, mit dem Docker-API zu kommunizieren.

Abb. 6: doclipser-Konfigurationsdatei

Abb. 6: doclipser-Konfigurationsdatei

Es folgt eine kurze Beschreibung der Properties:

  • api.url: Der URI des Docker-API. Das kann der Docker Socket sein (Linux-Default-Einstellung) oder IP-Adresse und Port des Docker-API (bei Windows und Mac OS X).
  • api.cert.path: Der Dateisystempfad zu den Docker-bezogenen Zertifikaten.
  • client.lib: Die Java Docker API Library, die mit doclipser genutzt wird. Diese Property dient dem Debuggen und muss im Normalfall nicht geändert werden.

doclipser Development

Wenden wir uns nun einigen Implementierungsdetails und den Tools für die Entwicklung von doclipser zu.

Der Dockerfile-Editor wurde mithilfe von Xtext entwickelt. Xtext ist ein Framework, mit dem sich auf einfache Art und Weise die Grammatik einer domänenspezifischen Sprache definieren lässt. Es deckt dabei alle Aspekte einer vollständigen Spracheninfrastruktur ab, angefangen bei Parser über Linker, Compiler oder Interpreter bis hin zur vollen Eclipse-DIE-Integration.

Die Dockerfile-Grammatik, die wir entwickelt haben, trägt den Namen com.zenika.doclipser.dsl.DockerfileDsl und kann in der Datei DockerfileDsl.xtext gefunden werden. So sieht beispielsweise die Definition der FROM-Instruktion aus:

From:
    'FROM ' name=ID (':' tag=ID)?
;

Xtext liefert automatisch Dinge wie Syntaxhervorhebungen, Autovervollständigung, Validierung und Quick Fixes auf Basis der lexikalischen Struktur und der semantischen Daten. Des Weiteren ist es einfach, Tests für die Grammatik zu schreiben:

@Test
def void parseFromWithTag() {
  var dockerfile = parser.parse("FROM busybox:latest")
  assertTrue(dockerfile.eResource.errors.empty);
  val from = dockerfile.instructions.head as From
  assertEquals("latest",from.tag)
}

Dieser Auszug stammt aus DockerfileParserTest.xtend und ist in der Programmiersprache Xtend geschrieben.

Das Starten von Docker-Anweisungen

Für die Kommunikation mit der Docker Engine haben wir den Spotify-Docker-Client für die JVM verwendet. Es handelt sich dabei um eine großartige Bibliothek, die vom Spotify-Entwicklerteam bereitgestellt wird und dabei hilft, Docker in Java-Programmen zu nutzen:

// Create a client based on DOCKER_HOST and DOCKER_CERT_PATH env vars
final DockerClient docker = DefaultDockerClient.fromEnv().build();
// Pull an image
docker.pull("busybox");

CI-Infrastruktur

doclipser Builds sind vollständig automatisiert. Wir nutzen Maven Tycho für den Bau von Eclipse-Plug-ins. Das erlaubt es uns, OSGi Bundles automatisch mittels Maven zusammenzusetzen, oder manuell über die Eclipse-IDE.

CircleCI ist die Continuous Integration Platform, die genutzt wird, um neue Artefakte zu erzeugen, sobald ein Commit auf GitHub gemerged wird (Abb. 7). Und schließlich verwenden wir Bintray für die Verteilung des Plug-ins.

Abb. 7: CircleCI-Build-Details

Abb. 7: CircleCI-Build-Details

Pläne für die Zukunft

Wir sind derzeit darauf fokussiert, Bugs zu beheben und die Stabilität von doclipser zu verbessern. Die Issues sind auf GitHub zu finden. Sobald diese Arbeiten abgeschlossen sind, wollen wir den Support für Docker compose angehen. Damit soll ein mächtiges neues Feature in doclipser Einzug halten, mit dem es möglich werden wird, ganze Anwendungsstacks mittels docker-compose.yml-Files zu starten und zu konfigurieren.

Ein anderes cooles Feature, das auf der Implementierungsliste steht, sind Dockerfile Quick Fixes. Das sind die Verbesserungen, die Eclipse vorschlägt, wenn die Syntax eines Dockerfiles Fehler aufweist.

Fazit

Soweit unser kleiner Rundgang durch das doclipser-Projekt. doclipser ist Open Source, der Quellcode ist auf GitHub verfügbar. Mitstreiter am Projekt sind jederzeit willkommen. Wer also Ideen hat oder Beiträge zur Verbesserung des Plug-ins leisten möchte, ist eingeladen, auf GitHub Kontakt mit uns aufzunehmen!

Verwandte Themen:

Geschrieben von
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: