IRCNF

DevContainers werden zur Standardmethode, um mit dem Programmieren eines neuen Projekts zu beginnen

Teilen:
DevContainers werden zur Standardmethode, um mit dem Programmieren eines neuen Projekts zu beginnen

Jedes Softwareprojekt produziert irgendwann den Satz „bei mir funktioniert es“. Die Ursache ist immer dieselbe: Entwicklungsumgebungen sind lokal, unsichtbar und nahezu unmöglich vollständig zu dokumentieren. Sie können zwar eine requirements.txt oder eine package.json committen, aber nicht die Python-Version, die spezifische Version einer C-Bibliothek, die von einer nativen Erweiterung gelinkt wird, die Umgebungsvariablen in Ihrem Shell-Profil oder die global installierten Systemtools. Die Lücke zwischen dem, was eingecheckt ist, und dem, was tatsächlich läuft, ist der Ort, an dem das Debuggen stirbt.

Dev Containers sind ein spezifikationsbasierter Ansatz, um Entwicklungsumgebungen reproduzierbar, portabel und zusammen mit dem Code versionierbar zu machen. Die Spezifikation, ursprünglich von Microsoft für VS Code entwickelt, aber jetzt als offener Standard unter der GitHub-Organisation devcontainers gepflegt, definiert eine Datei .devcontainer/devcontainer.json, die die gesamte Umgebung beschreibt: welches Docker-Image oder Dockerfile verwendet werden soll, welche VS Code-Erweiterungen zu installieren sind, welche Ports weitergeleitet werden, welche Lebenszyklus-Befehle beim Start ausgeführt werden und welche Umgebungsvariablen eingefügt werden.

Wie es funktioniert

Wenn Sie ein Projekt mit einer .devcontainer-Konfiguration in VS Code öffnen, fordert die IDE Sie auf, es in einem Container erneut zu öffnen. Es erstellt oder zieht das angegebene Docker-Image, führt den Container aus und mountet Ihr Projektverzeichnis darin. Ihr Editor arbeitet dann, als ob er lokal laufen würde, aber seine Sprachserver, Linters, Formatierer und Debugger werden alle innerhalb des Containers gegen die exakte Umgebung ausgeführt, die in der Konfigurationsdatei angegeben ist. Auf einem anderen Entwicklerrechner – oder in GitHub Codespaces oder in einer CI-Pipeline – wird derselbe Container identisch erstellt und ausgeführt.

Das Format devcontainer.json ist zu einem ziemlich vollständigen Umgebungs-DSL herangewachsen. Sie können ein Basis-Image (mcr.microsoft.com/devcontainers/python:3.12, ein internes Image eines Teams oder ein lokales Dockerfile) angeben, zusätzliche Systempakete über features installieren – kleine zusammensetzbare Umgebungsaddons, die von Microsoft und der Community für Dinge wie Docker-in-Docker, GitHub-CLI, Terraform oder Node.js gepflegt werden – und Post-Create-Befehle angeben, die automatisch ausgeführt werden, wenn der Container startet. Das Feld customizations.vscode.extensions von VS Code stellt sicher, dass jeder Entwickler das Projekt mit demselben Satz installierter Erweiterungen öffnet, ohne manuell koordinieren zu müssen, welche Version welches Linters jeder verwendet.

GitHub Codespaces und die Cloud-Entwicklungsumgebung

GitHub Codespaces ist die größte Bereitstellung der Dev Container-Spezifikation. Wenn Sie einen Codespace in einem beliebigen GitHub-Repository öffnen – einschließlich eines Forks, den Sie noch nie bearbeitet haben – erstellt GitHub einen Container aus dem devcontainer.json des Repositorys (oder einer sinnvollen Voreinstellung, falls keine vorhanden ist) und gibt Ihnen ein vollständig konfiguriertes browserbasiertes VS Code, das damit verbunden ist. Die Entwicklungsumgebung ist in etwa 30 Sekunden verfügbar.

Für Open-Source-Beiträge sind die Auswirkungen auf den Onboarding-Prozess erheblich. Der traditionelle Weg, zu einem Projekt beizutragen, umfasste das Klonen, das Lesen einer CONTRIBUTING.md, das Installieren von Sprachlaufzeiten, das Herausfinden, welche Version einer Abhängigkeit mit etwas anderem auf Ihrem System kollidiert, und 45 Minuten, bevor Sie eine Zeile geschrieben hatten. Ein mit Codespace ausgestattetes Repository reduziert das auf: Klicken Sie auf „Code“, klicken Sie auf „Open in Codespace“, warten Sie 30 Sekunden, beginnen Sie zu programmieren. Für Maintainer, die die Beitragshürde senken wollen, ist das eine bedeutende Änderung.

Für Organisationen bietet Codespaces einen anderen Wert: die Einarbeitungszeit von Entwicklern. Der erste Tag eines neuen Ingenieurs in einem Unternehmen umfasst in der Regel Stunden der Konfiguration einer lokalen Entwicklungsumgebung – Installation der richtigen Version jedes Tools, Einrichtung von Anmeldeinformationen, Ausführung von Setup-Skripten, die nur halb funktionieren. Ein richtig konfigurierter Devcontainer reduziert das auf das Öffnen eines Browsers. GitHub berichtet, dass Organisationen, die Codespaces regelmäßig nutzen, die Einarbeitungszeit von Tagen auf Stunden reduzieren sehen.

Über VS Code hinaus: Die offene Spezifikation

Die Dev Container-Spezifikation ist nicht mehr exklusiv für VS Code. JetBrains-IDEs (IntelliJ, WebStorm, PyCharm, GoLand) unterstützen Devcontainer-Konfigurationen nativ. Die devcontainer CLI ermöglicht das Erstellen und Ausführen von Containern über die Befehlszeile ohne IDE. Und da die Spezifikation auf Docker basiert, kann jedes CI-System, das Docker ausführen kann, denselben Container für Tests verwenden, den Entwickler für die Entwicklung nutzen – und eliminiert damit die Klasse von Fehlern „läuft lokal, scheitert in CI“, die durch Umgebungsunterschiede entstehen.

Daytona, Coder und mehrere andere Unternehmen haben verwaltete Remote-Entwicklungsumgebungsplattformen auf Basis der Dev Container-Spezifikation entwickelt, die auf Unternehmen abzielen, die Codespaces-ähnliche Funktionalität ohne GitHub-Abhängigkeit wünschen. Der offene Standard bedeutet, dass das Tool-Ökosystem nicht an einen einzelnen Anbieter gebunden ist.

Wann DevContainers den Overhead wert sind

DevContainers sind nicht für jedes Projekt das richtige Werkzeug. Der Overhead ist real: die Startzeit des Containers (normalerweise 5–30 Sekunden, abhängig von Image-Größe und Hardware), die kognitive Ebene „bin ich gerade im Container?“ und die Ingenieurszeit zum Schreiben und Pflegen einer guten devcontainer.json. Für ein Solo-Projekt mit einem stabilen, einfachen Stack können eine virtuelle Umgebung und eine README-Datei ausreichen.

Wo sich DevContainers eindeutig bezahlt machen: Projekte mit komplexen nativen Abhängigkeiten (Datenbanktreiber, Bildverarbeitungsbibliotheken, ML-Frameworks mit CUDA-Anforderungen), Teams mit erheblicher Betriebssystem-Heterogenität (Windows-, macOS- und Linux-Entwickler am selben Projekt), Projekte mit langen Einarbeitungswegen und jedes Projekt, bei dem „es hat gestern funktioniert, ich habe heute Homebrew aktualisiert“ ein wiederkehrendes Gesprächsthema ist. Je komplexer und teamabhängiger die Umgebung, desto stärker das Argument.

Das Argument der CI-Parität ist unabhängig von der Teamgröße überzeugend. Tests in demselben Container auszuführen, in dem Sie entwickeln, eliminiert eines der frustrierendsten Debugging-Muster in der Software: einen Test, der aufgrund einer Umgebungsabhängigkeit (ein global installiertes Tool, eine Datei im Home-Verzeichnis, eine bestimmte Gebietsschemaeinstellung) lokal besteht und in CI fehlschlägt, weil die CI-Umgebung sauberer ist.

Der praktische Ausgangspunkt

Der einfachste Weg, DevContainers auszuprobieren, ist ein Projekt, das bereits ein Dockerfile hat oder Docker Compose verwendet. Fügen Sie eine .devcontainer/devcontainer.json hinzu, die auf Ihr vorhandenes Dockerfile verweist, geben Sie die Erweiterungen an, die Ihr Team verwendet, und committen Sie sie. Die VS Code Dev Containers-Erweiterung (kostenlos, über 30 Millionen Downloads) erledigt den Rest. Microsofts Devcontainer-Vorlagen – verfügbar unter containers.dev – bieten Ausgangspunkte für die gängigsten Stacks: Node.js, Python, Go, Rust, Java, .NET, Ruby, PHP und mehr.

Das Problem „bei mir funktioniert es“ wird durch DevContainers nicht vollständig gelöst – Laufzeitkonfiguration, Zustand der Produktionsdatenbank und Netzwerktopologieunterschiede bestehen weiterhin. Aber für die Schicht des Problems, die in Toolchain-Versionen und Systemabhängigkeiten lebt, ist die Spezifikation ausgereift genug, dass „einen Devcontainer hinzufügen“ jetzt ein vernünftiger Ratschlag für die meisten Projekte ist, die nicht trivial einfach sind.

Teilen:
DevContainers werden zur Standardmethode, um mit dem Programmieren eines neuen Projekts zu beginnen | IRCNF - Intelligent Reliable Custom Next-gen Frameworks