# Dev Containers Eine Schwierigkeit welcher die meisten Entwickler bereits begegnet sind, ist das aufsetzen der Entwicklungsumgebung. Bei einem neuen Projekt ist das meistens nicht ein grosses Problem, da die Umgebung mit dem Aufsetzen des Projekts bereits erstellt wird. Wenn man als Entwickler jedoch in ein bestehendes Projekt eintritt, kann es manchmal ziemlich schwierig sein, die Umgebung richtig aufzusetzen. Im Idealfall gibt es dafür eine Dokumentation in welcher alle Abhängigkeiten beschrieben werden. Anhand dieser Dokumentation kann die Umgebung dann nachgebaut werden und es sollte anschliessend grundsätzlich alles Funktionieren. Aber auch dann gibt es noch einige Reibungspunkte: Die Dokumentation muss immer aktuell gehalten werden und alle Abhängigkeiten müssen mit genügend Informationen beschrieben werden. Um diesen Prozess zu vereinfachen wurde ein Projekt namens *Development Containers*, kurz auch *Dev Containers* genannt, geschaffen. ## Was sind Development Containers? Ein Dev Container ist ein Container welcher einem erlaubt, eine vollumfängliche Entwicklungsumgebung in einem Container laufen zu lassen. Sie können genutzt werden um eine Applikation laufen zu lassen, verschiedene Tools, Bibliotheken oder Runtimes zu separieren, und um bei Continuous Integration und Testing zu helfen. Dev Containers können entweder lokal oder auch Remote ausgeführt werden. Die Development Container Spezifikation versucht bestehende Formate mit typischen entwicklungsspezifischen Einstellungen, Tools und Konfigurationen zu erweitern, während weiterhin eine vereinfachte, nicht orchestrierte Single Container Option anzubieten. So können sie für die Entwicklung oder für CI und Testing genutzt werden. Ausserdem ermöglicht die Spezifikation den Entwicklern, ihre Umgebung zu teilen und wieder zu verwenden.[^1] ## Die Spezifikation Das Ziel der Development Container Specification ist es, einen Weg anzubieten, durch welchen Containers mit Inhalt und Metadaten erweitert werden können, welche es ermöglichen darin zu entwickeln. Diese Umgebungen sollten einfach zu nutzen, erstellen und reproduzieren sein. Eine Umgebung ist definiert als eine logische Instanz einer oder mehrerer Development Containers, zusammen mit jeglichen benötigten *Side-Car* Containers.[^2] ### devcontainer.json Die Metadaten einer Umgebung bestehen aus einer Definition, welche unter der Kontrolle des Benutzers deterministisch Containers erstellt. Während die Struktur dieser Metadaten sehr wichtig ist, ist es auch wichtig zu deklarieren, wie diese Daten repräsentiert werden können. Ein Weg um diese Daten darzustellen ist über JSON in einer Datei namens `devcontainer.json`. Abgelegt werden kann diese Datei in einem der folgenden Pfade: - `.devcontainer/devcontainer.json` - `.devcontainer.json` - `.devcontainer/<ordner>/devcontainer.json`, wobei `<ordner>` ein Unterordner ist. ### Features Ein zentraler Bestandteil der Dev Container Spezifikation sind Features. Ein Feature beschreibt eine eigenständige, wiederverwendbare Einheit von Installationscode und Konfiguration. Stell dir ein Feature als ein kleines, konfigurierbares Modul vor, das du deiner Entwicklungsumgebung hinzufügen kannst. Beispiele für Features sind: - **Installationen von Tools:** Wie z.B. die Go-Runtime, Node.js oder der Azure CLI. - **Betriebssystem-Konfigurationen:** Spezifische Einstellungen oder Systempakete. Der Hauptvorteil von Features ist ihre Modularität und Wiederverwendbarkeit. Anstatt den gesamten Installationsprozess für ein Tool in jedes Projekt zu kopieren, kannst du einfach auf ein **Feature** verweisen. Die Spezifikation definiert, wie diese Features strukturiert und referenziert werden können, typischerweise aus einem Feature-Registry. Dadurch wird die `devcontainer.json` schlanker und die Container-Definitionen bleiben aufgeräumter und leichter pflegbar. Features können auch Parameter haben, wodurch du die Installation oder Konfiguration spezifisch für dein Projekt anpassen kannst, ohne das Feature selbst ändern zu müssen. ## Vorteile von Dev Containers Die Nutzung von Dev Containers bietet eine Reihe signifikanter Vorteile, die den Entwicklungsprozess optimieren und vereinfachen: ### 1. Reproduzierbarkeit und Konsistenz Der grösste Vorteil ist die garantierte Konsistenz der Entwicklungsumgebung. Da alle Abhängigkeiten, Tools, Runtimes und Konfigurationen im Container definiert sind, arbeitet jeder Entwickler mit exakt der gleichen Umgebung. Dies eliminiert die berüchtigten "Auf meinem Rechner funktioniert's"-Probleme, die oft durch lokale Unterschiede in Betriebssystemen, Tool-Versionen oder Systempfaden entstehen. Neue Teammitglieder können sofort mit der Entwicklung beginnen, ohne Stunden oder Tage mit dem Setup verbringen zu müssen. ### 2. Isolation Dev Containers bieten eine saubere Trennung von lokalen System-Setups. Du kannst verschiedene Projekte entwickeln, die unterschiedliche Versionen derselben Tools (z.B. Python 2.7 und Python 3.11) benötigen, ohne dass diese sich gegenseitig stören. Die lokale Maschine bleibt sauber und frei von projektspezifischen Abhängigkeiten und Konfigurationen. ### 3. Einfaches Onboarding Das Onboarding neuer Entwickler wird drastisch vereinfacht. Anstatt eine lange und potenziell veraltete Dokumentation abarbeiten zu müssen, genügt es, das Projekt zu klonen und den Dev Container zu starten. Alle notwendigen Tools, Bibliotheken und Einstellungen sind sofort verfügbar und vorkonfiguriert. ### 4. Portabilität und Remote-Entwicklung Dev Containers können nicht nur lokal, sondern auch auf leistungsstarken Remote-Maschinen oder in der Cloud ausgeführt werden. Dies ermöglicht es Entwicklern, auch von Geräten mit geringerer Leistung aus (wie z.B. einem Tablet oder einem älteren Laptop) an komplexen Projekten zu arbeiten, wobei die Rechenlast vom Remote-Server getragen wird. ## Fazit Dev Containers, basierend auf der Development Container Specification, stellen eine fundamentale Verbesserung für das Management von Entwicklungsumgebungen dar. Sie adressieren die häufigsten Reibungspunkte beim Projekt-Setup - Inkonsistenz und komplexes Onboarding - indem sie die gesamte Entwicklungsumgebung in einem portablen, reproduzierbaren Container kapseln. Durch die Verwendung der `devcontainer.json` zur Definition und der Features zur modularen Erweiterung wird eine Umgebung geschaffen, die nicht nur konsistent, sondern auch einfach zu warten und zu erweitern ist. Dev Containers sind damit ein essenzielles Werkzeug in der modernen Softwareentwicklung, da sie die Zusammenarbeit optimieren, die Produktivität steigern und es Entwicklern ermöglichen, sich auf das zu konzentrieren, was wirklich zählt: das Schreiben von Code. Die Spezifikation setzt sich zunehmend als Industriestandard durch und wird von grossen Tools und Anbietern unterstützt, was ihre langfristige Relevanz und Akzeptanz sichert. [^1]: vgl. Overview, in: Development Containers Dokumentation, 29.09.2025, https://containers.dev/overview [^2]: vgl. Specification, in: Development Containers Dokumentation, 29.09.2025, https://containers.dev/implementors/spec/