So geht Dev-Container

Container sind auch gute Entwicklungs-Tools.
urzine | shutterstock.com



Container stellen für moderne Applikationsplattformen eine Schlüsselkomponente dar. Sie isolieren Anwendungen und verwandeln das „Userland“ gleichzeitig in eine portable Laufzeitumgebung. Container ermöglichen auch, alle notwendigen Code-Abhängigkeiten sowohl zu „verpacken“ als auch auszuführen – während Entwickler parallel Ressourcen managen und Services nach oben oder unten skalieren.



Sieht man einmal von Tools wie Github Codespaces ab, spielt die Container-Technologie im Bereich der Softwareentwicklung bisher allerdings nur selten eine Rolle. Das ist verwunderlich, schließlich bieten sie eine ideale Möglichkeit, ganze Entwicklungsumgebungen zu verpacken – inklusive sämtlicher Services, die nötig sind, um Code zu erstellen und zu testen.



Günstiger Weise sind die Tools, die zum Einsatz kommen, um Codespaces-Container zu managen, allgemein verfügbar. Das können Sie nutzen, um Ihre eigenen Dev-Container zu erstellen und zu verwalten – in der Public Cloud oder On-Premises. Wie das geht, lesen Sie in diesem Artikel.  



IDEs teilen per Container



Die Idee hinter Dev-Containern ist simpel: Alle Services, die für die Anwendungsentwicklung wichtig sind, wandern in einen Docker-Container. Der lässt sich dann über eine virtuelle Maschine ausführen, der Code über Remote-Development- und -Debugging-Tools verwalten. Beherbergen kann dieser Container alles Mögliche, von Datenbanken über Mock-API-Endpunkte bis hin zu den benötigten Runtimes und Bibliotheken. Das Risiko von Interferenzen mit anderen Anwendungen wird dabei durch die Isolierung des Containers minimiert. 



Für Entwickler bringt das in erster Linie den Vorteil, Ihre Rechner nicht mehr konfigurieren zu müssen. Sie laden einfach den Dev-Container zum Projekt herunter und mounten diesen, schon kann die Programmierarbeit losgehen. Das spart nicht nur massiv Zeit, sondern unterstützt auch leitende Developer dabei, sicherzustellen, dass alle Projektbeteiligten auf dem gleichen Stand bleiben. Und sollte doch einmal etwas schiefgehen, ist es ohne Weiteres möglich, die aktuelle Umgebung zu verwerfen, einen neuen Dev-Container herunterzuladen, das betreffende Git-Repository zu klonen – um anschließend genau dort weiterzuarbeiten, wo das Malheur aufgetreten ist.



In der Microsoft-Welt kommen Dev-Container inzwischen immer häufiger zur Anwendung. Das liegt auch daran, dass der Windows-Konzern das Open-Source-Projekt sponsert, beispielsweise in Form mehrerer GitHub-Repositories. Das Azure SQL-Team hat vor kurzem zudem eine Reihe vordefinierter, vorkonfigurierter Templates angekündigt, die Sie verwenden können, um Ihre eigenen Dev-Conatiner aufzusetzen. Die Templates bieten Support für gängige Entwicklungs-Tools und eine schlüsselfertige Datenbank. Und obwohl es eher eine Worst Practice darstellt, Daten in Container zu integrieren – in diesem Fall werden sie als Entwicklungsumgebung und nicht als zustandslose Userspace Runtime genutzt.



Falls Sie Windows für die Anwendungsentwicklung nutzen, profitieren Dev-Container zudem von Visual Studio Code und der integrierten, virtuellen Maschine Windows Subsystem for Linux (WSL). Damit haben Sie bereits alles was Sie brauchen, um Dev-Container kostenlos zu erstellen und zu betreiben.



Dev-Container erstellen



Die ursprüngliche Dev-Container-Spezifikation beschreibt ein strukturiertes JSON-Format, in dem die Grundkonfiguration eines Dev-Containers gespeichert wird – devcontainer.json. Zusätzliche Informationen werden in Image Labels und speziellen Skripten namens Dev Container Features (dazu gleich mehr) festgehalten. Das Resultat sollte alle Tools beschreiben, die nötig sind, um den Application Development Lifecycle zu unterstützen.



Das Setup eines Dev-Containers muss dabei wiederholbar sein, damit gewährleistet ist, dass jedes Mal das gleiche Ergebnis unter dem Strich steht, wenn ein Dev-Container über eine Beschreibung erstellt wird. Jeder, der Code innerhalb eines solchen Containers erstellt, erhält so denselben Output, wenn der Branch getestet wird – was Merges und Pull Requests vereinfacht.



Es ist zwar möglich, eine Containerdefinition von Grund auf neu zu erstellen, aber deutlich einfacher, die Visual-Studio-Code-Erweiterung „Dev Containers“ (Teil des Remote Development Extension Pack) zu verwenden, um Container zu erstellen und zu verwalten. Noch simpler ist es, einfach das Image einer Entwicklungsumgebung aus Microsofts Dev-Container-Repository herunterzuladen und anschließend eigene Anpassungen vorzunehmen. Weitere Optionen sind beispielsweise Port Forwarding, so dass Sie Applikations-Outputs auf Ihrem Host-Rechner testen und debuggen können.



Dev Containers Features bieten eine praktische Möglichkeit, einem Container vordefinierte Anwendungen und Tools hinzuzufügen. Diese wiederverwendbaren Codeschnipsel können einer bestehenden Dev-Container-Definition hinzugefügt werden, um das per Code beschriebene Tool zu inkludieren. Sie werden in Form eines Ordners verteilt, der eine devcontainer-feature.json-Definition sowie ein Installationsskript und alle notwendigen Dateien enthält.



Dev-Container nutzen



Sobald Sie Dev-Container im Rahmen Ihrer Standard-Toolchain verwenden, können Sie eine Feature-Bibliothek erstellen, die sich schnell und einfach Ihren Container-Definitionen hinzufügen lässt. Sie können Container von der Stange anpassen oder schnell eine neue Definition für ein neues Projekt erstellen, indem Sie die Funktionen als Bausteine behandeln, die auf einem Standard-Basiscontainer aufsetzen, der für einen bestimmten Stack definiert wurde.



Der grundlegende Prozess, um einen Dev-Container zu erstellen, ist ein Top-Down-Ansatz. Dieser sollte damit beginnen, dass sich Softwarearchitekten und leitende Entwickler auf einen Projekt-Stack einigen. Anschließend gilt es, ein geeignetes Basisplattform-Image in der VS-Code-Containergalerie zu finden – zum Beispiel .NET. Dieses kann anschließend auf das jeweilige Projekt angepasst und um neue Tools ergänzt werden, indem Sie devcontainer.json in VS Code bearbeiten und vordefinierte Funktionen hinzufügen. Sobald der Container einsatzbereit ist, verteilen Sie ihn und die erforderlichen VS-Code-Tools an Ihr Dev-Team.



Auf Ihrem lokalen Container-Host muss Docker laufen – oder zumindest ein Docker-kompatibles CLI installiert sein. Die Befehlszeilenschnittstelle ist in letzterem Fall der Schlüssel, weil der Dev-Container dann über diese arbeitet und keinen direkten Zugriff auf den Container-Host benötigt. Das ist sowohl von Vor- als auch von Nachteil: Zwar bestehen dann keine Abhängigkeiten zu APIs oder Docker selbst. Unterstützt jedoch die Container-Umgebung das Docker-CLI nicht, entstehen Probleme – zum Beispiel, wenn Sie alternative Container-Engines wie Podman verwenden. Die gute Nachricht: Dev-Container sind ein Open-Source-Projekt. Es wird also laufend daran gearbeitet, weitere Container-Engines zu unterstützen. Zudem ist es möglich, über Github Anfragen zu stellen – oder selbst Code einzureichen. 



Sobald ein Container auf einer lokalen Docker-Instanz (Hyper-V oder in WSL) läuft, können Sie die Remote-Tools von VS Code verwenden, um sich zunächst mit Ihrem Container zu verbinden und anschließend eine VS-Code-Umgebung zu installieren. Dadurch wird Ihr lokaler VS Code für die Benutzeroberfläche verwendet und die Erweiterungen, die Sie in Ihrer devcontainer.json beschrieben haben, werden in der Remote-Instanz installiert. Das gewährleistet, dass Ihre persönliche Auswahl an Extensions in Ihrer lokalen Entwicklungsumgebung bleibt – getrennt von denen in Ihrem Dev-Container. Obwohl Sie nichts daran hindert, Erweiterungen über die bereitgestellten hinaus hinzuzufügen.



Über Dev Container Features Tools zu einem Container hinzuzufügen, der Ihren Runtime-Stack enthält, eröffnet Ihnen eine neue Möglichkeit, Ihren Code im Rahmen Ihres CI/CD-Prozesses zu testen: Sie können Ihren Dev-Container in Github Action oder eine Azure-Devops-Pipeline integrieren. Oder Sie nutzen einen Runtime-Container als Host, um Code in einer Kubernetes-Produktionsumgebung auszuliefern.



Wenn Sie mit der Entwicklung in einem Container beginnen, bleibt der Code während seines gesamten Lebenszyklus in derselben Umgebung. Das hilft Devs dabei, die Einschränkungen und Vorteile zu verstehen, die mit Cloud-nativen Anwendungen einhergehen. Dev-Container können Teams darüber hinaus dabei unterstützen, sich auf eine konsistente Grundlage für ein Projekt zu fokussieren, die bei Bedarf schnell zurückgesetzt und neu geladen werden kann. (fm)









Sie wollen weitere interessante Beiträge zu diversen Themen aus der IT-Welt lesen? Unsere kostenlosen Newsletter liefern Ihnen alles, was IT-Profis wissen sollten – direkt in Ihre Inbox!