Benutzerdefinierte Dev Container Features
15. September 2022 von Brigit Murtaugh, @BrigitMurtaugh
Wir kennen doch alle diesen Moment bei der Einrichtung unserer Entwicklungsumgebung: "Ach, ich brauche nur noch eins!" – dieses "Eins" ist eine weitere Sprache oder ein weiteres Toolset (oder vielleicht sogar ein paar mehr 😊), um an Ihrem Projekt zu arbeiten.
Entwicklungcontainer (Dev Container) sind eine großartige Möglichkeit, die Einrichtung der Umgebung zu vereinfachen – sie bieten eine vollständige Coding-Umgebung mit den Tools, die Ihr Projekt benötigt. Sie werden mithilfe eines Images, einer Dockerfile oder einer Docker Compose-Datei und devcontainer.json konfiguriert. devcontainer.json ist ein Metadatenformat, das verwendet wird, um Container mit entwicklungspezifischen Inhalten und Einstellungen anzureichern.
Beim Erstellen von Dev Containern können Sie immer wieder die gleiche Reaktion haben: "Ich brauche nur noch eins!" – vielleicht verwenden Sie in Ihrer Dockerfile ein Node.js-Image und müssen nur Git hinzufügen. Oder Sie müssen etwas Komplexeres hinzufügen, wie z. B. die Arbeit mit Docker oder Kubernetes aus Ihrem Dev Container heraus. Dev Container sind großartig, da jeder, der auf Ihren Code zugreift, die gleiche, konsistente Erfahrung mit all diesen von Ihnen hinzugefügten Tools hat – aber wie fügt man sie am besten hinzu?
Was wäre, wenn es eine einfache Möglichkeit gäbe, dieses zusätzliche Tool in Ihrem Dev Container zu installieren, indem Sie einfach den Namen und die Version des Tools angeben? Oder was wäre, wenn Sie als Tool-Nutzer oder -Autor einen einfachen Weg für andere schaffen könnten, es zu installieren? Das Teilen manueller Skripte kann bei der Wiederverwendung helfen, aber wenn Sie auf eines verweisen, vergessen Sie möglicherweise, Container- oder Tooling-Einstellungen zu referenzieren, wie z. B. die Aktivierung der ptrace-Unterstützung für das Debugging von Go, Rust oder C++, das Hinzufügen eines spezifischen Einstiegspunkts, der beim Start des Containers ausgeführt wird, oder die Sicherstellung, dass die richtigen VS Code-Erweiterungen enthalten sind.
Funktionen
Wir freuen uns, Ihnen mitteilen zu können, dass Dev Container Features Ihnen helfen, die benötigten Tools reibungslos in Ihren Dev Container zu integrieren!
Features sind in sich geschlossene Einheiten von Installationscode, Container-Konfiguration und/oder Einstellungen und Erweiterungen, die darauf ausgelegt sind, neue Entwicklungsmöglichkeiten in Ihrem Dev Container zu ermöglichen. Sie können für eine Vielzahl von Basis-Container-Images erstellt werden. Im Rahmen unserer Arbeit an der offenen Dev Container-Spezifikation haben wir einige Verbesserungen vorgenommen, wo Sie vorab erstellte Features finden und wie Sie Ihre eigenen erstellen und verteilen können.
Lassen Sie uns sehen, was es Neues gibt und wie Sie mit Features aus jedem Dev Container-fähigen Tool oder Dienst (wie der VS Code Dev Containers-Erweiterung oder GitHub Codespaces) loslegen können!
Features zu Ihrem Dev Container hinzufügen
Dev Container Features bieten eine schnelle Möglichkeit, Dev Container-Metadaten mit einigen Installationsschritten zu verknüpfen. Sie können sie über eine einfache Referenz zu Ihren Dev Containern hinzufügen.
Diese Features können nun als OCI-Artefakte in jeder unterstützenden Container-Registry gespeichert werden. Das bedeutet, Sie können sie mit denselben Arten von Identifikatoren referenzieren, die Sie zum Referenzieren eines Container-Images verwenden würden. Wir haben einige frühe Features, die im vscode-dev-containers-Repository enthalten waren, in ein neues Repository namens devcontainers/features verschoben, wo sie mit diesem neuen Ansatz veröffentlicht werden.
Das Referenzieren verschiedener Features aus dem `devcontainers/features`-Repository ist so einfach wie das Hinzufügen einer `features`-Eigenschaft zu Ihrer `devcontainer.json`. Jedes Feature hat eine `README.md`, die zeigt, wie das Feature referenziert wird und welche Optionen dafür verfügbar sind.
Das folgende Beispiel installiert die Features go und docker-in-docker
"name": "my-project-devcontainer",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/devcontainers/features/go:1": {
"version": "1.18"
},
"ghcr.io/devcontainers/features/docker-in-docker:1": {
"version": "latest",
"moby": true
}
}
Sie können auch offizielle und öffentlich beigesteuerte Features auf der Spezifikationsseite erkunden. Jedes Feature kann durch Bearbeiten der `devcontainer.json` hinzugefügt werden, und öffentlich veröffentlichte Features können über vorhandene Dev Container-Konfigurationserlebnisse (wie in der Dev Containers-Erweiterung von VS Code verfügbar) hinzugefügt werden.

Sie können Dev Container sogar mit Features aus Ihrem bevorzugten CI-System verwenden, indem Sie die Dev Container CLI, eine GitHub Action oder eine Azure DevOps-Aufgabe nutzen. Wir haben eine GitHub Action und eine Azure DevOps-Aufgabe im Repository devcontainers/ci verfügbar. Die Dev Container CLI, GitHub Action oder Azure DevOps-Aufgabe können auch zum Vorkompilieren von Images verwendet werden, die Feature-Inhalte enthalten, um die Startzeiten zu beschleunigen.
Wenn Sie nicht nur öffentlich verfügbare Features nutzen, sondern auch Ihre eigenen privaten oder öffentlichen erstellen und teilen möchten, lesen Sie weiter!
Erstellung
Ein großartiger Einstiegspunkt für die Erstellung eigener Features ist das neue Repository Features-Vorlage. Über eine gute Vorlage für die Inhalte eines bestimmten Features hinaus enthält die Vorlage auch einen GitHub Actions-Workflow, um sie schnell zu veröffentlichen. Dabei wird die GitHub Container Registry (GHCR) für Ihr Konto verwendet, um Sie so schnell wie möglich einsatzbereit zu machen. Wir werden später mehr über die Veröffentlichung sprechen.
Der Quellcode eines Features hat zwei Komponenten: Ein Installationsskript (`install.sh`) und eine Konfigurationsdatei (`devcontainer-feature.json`).
+-- feature
| +-- devcontainer-feature.json
| +-- install.sh
| +-- (other files)
install.sh: Das Einstiegsskript für die Installation – es wird konzeptionell als Ebene des Dockerfiles des Images hinzugefügt und zur Build-Zeit ausgeführt. Dieses Einstiegsskript kann Tools wie Sprachen (z. B. Ruby) und Tools (GitHub CLI) installieren.
devcontainer-feature.json: Dies enthält Metadaten über das Feature, eine Reihe von Optionen, die während der Installation an das Installationsskript eines Features übergeben werden können, sowie "Teile" von `devcontainer.json`, die in den endgültigen Dev Container zusammengeführt werden. Wenn beispielsweise ein Feature in seiner Konfiguration `"privileged": true` angibt, wird der gesamte Dev Container mit dem Flag `--privileged` gestartet.
Features können in einer Vielzahl von Sprachen erstellt werden, wobei Shell-Skripte am einfachsten sind. Wenn ein Feature in einer anderen Sprache verfasst ist, sollten Informationen dazu in den Metadaten enthalten sein, damit Benutzer eine informierte Entscheidung treffen können.
Hinweis: Während `install.sh` Features in jeder Sprache ausführt, würde der Code fehlschlagen, wenn Sie ein Feature in einer interpretierten Sprache geschrieben hätten, die nicht im Dev Container vorhanden war. Stellen Sie sicher, dass Sie die benötigte(n) Sprache(n) als Teil von `install.sh` beziehen.
Sie sollten sicherstellen, dass öffentlich veröffentlichte Features neben dem Feature auch Abhängigkeiten prüfen und installieren.
Darüber hinaus ist es sehr wahrscheinlich, dass öffentliche Features sowohl von ARM64- als auch von x86_64-Maschinen verwendet werden – passen Sie sich also, wenn möglich, daran an.
Sie können die Eigenschaften von `devcontainer-feature.json` in der Spezifikation sowie öffentliche Beispiele im Repository devcontainers/features überprüfen.
Nachdem wir nun gesehen haben, wie man ein Feature erstellt, wie kann ich es anderen verteilen?
Verteilung
Features werden als Tarballs verteilt. Der Tarball enthält den gesamten Inhalt des Feature-Unterverzeichnisses, einschließlich der Datei `devcontainer-feature.json`, `install.sh` und aller anderen Dateien im Verzeichnis.
Die Open Container Initiative (OCI) definiert Industriestandards für Container und Container-Ressourcen. Wir behandeln Features als OCI-Artefakte und verwenden das Konzept einer OCI-Registry zur Verteilung von Features.
Das oben erwähnte Repository Features-Vorlage enthält einen GitHub Actions-Workflow, um den Veröffentlichungsprozess zu automatisieren. Er verpackt das Feature in einen Tarball und veröffentlicht die Assets als OCI-Artefakt in GHCR. Lösen Sie den Workflow `release.yaml` aus dem Vorlagen-Repository aus, indem Sie ihn auf der linken Seite des Actions-Tabs des Repositorys auf GitHub auswählen. Die GitHub Action veröffentlicht das Feature in GHCR unter dem Namensraum `
Hinweis: Ein manueller Schritt mit GHCR besteht darin, das OCI- Paket als "öffentlich" zu markieren. Dies muss nur einmal pro Feature erfolgen. Private Features erfordern diesen Schritt nicht und können abgerufen werden, solange Sie sich mit den Anmeldeinformationen Ihrer Registry bei der Docker CLI angemeldet haben.
Teilen Sie Ihre Features mit der Community
Wenn Ihre Beiträge in der Benutzeroberfläche für die Erstellung von Dev Containern in VS Code Dev Containers oder GitHub Codespaces erscheinen sollen, können Sie die folgenden Schritte ausführen:
- Gehen Sie zu devcontainers.github.io (dem GitHub-Repository, das containers.dev unterstützt)
- Öffnen Sie einen PR, um die Datei
collection-index.ymlzu ändern
Nach dem Zusammenführen erscheint Ihre Änderung unter containers.dev/collections.
Installationsreihenfolge von Features
Was, wenn mein Feature nur nach einem anderen installiert werden soll? Als Feature-Autor stellen Sie möglicherweise fest, dass Ihr Feature vor oder nach anderen Features installiert werden soll. In Ihrer `devcontainer-feature.json` können Sie die Eigenschaft `installsAfter` verwenden, um Features aufzulisten, die davor ausgeführt werden sollen.
Als Endbenutzer können Sie die Ausführungsreihenfolge mit der Eigenschaft `overrideFeatureInstallOrder` in Ihrer `devcontainer.json` weiter steuern. Alle Feature-IDs in diesem Array werden vor allen anderen Features in der angegebenen Reihenfolge installiert. Als Beispiel:
"features": {
"ghcr.io/devcontainers/features/java:1",
"ghcr.io/devcontainers/features/node:1",
},
"overrideFeatureInstallOrder": [
"ghcr.io/devcontainers/features/node"
]
Standardmäßig werden Features auf einem Basis-Image in einer Reihenfolge installiert, die vom implementierenden Tool als optimal erachtet wird.
Wenn eine der folgenden Eigenschaften in der `devcontainer-feature.json` des Features oder in der `devcontainer.json` des Benutzers angegeben ist, wird die von diesen Eigenschaften angezeigte Reihenfolge (mit abnehmender Priorität) beachtet:
- Die Eigenschaft `overrideFeatureInstallOrder` in der `devcontainer.json` des Benutzers. Ermöglicht Benutzern die Kontrolle über die Ausführungsreihenfolge ihrer Features.
- Die Eigenschaft `installsAfter`, die als Teil der `devcontainer-feature.json` eines Features definiert ist.
Sie können mehr über die Ausführung und Installationsreihenfolge von Features in der Spezifikation lesen.
Was gibt es noch Neues?
Neben dem neuen Features-Repository haben wir kürzlich ein neues Repository namens devcontainers/images Open Source gemacht, in dem wir eine spezifische Reihe von Images hosten, die zuvor im Repository vscode-dev-containers enthalten waren.
Wir entwickeln einen Community-Verteilungsplan für Dev Container-Vorlagen (was wir in vscode-dev-containers als "Definitionen" bezeichnen), den wir voraussichtlich ähnlich wie Features gestalten werden. Wir werden auf jeden Fall ein Update im vscode-dev-containers-Repository posten, so wie wir es bei der Ankündigung der neuen Features- und Images-Repositories getan haben.
Wie kann ich mehr erfahren?
Dieser Beitrag kratzt nur an der Oberfläche dessen, was Sie mit Features tun können, und wir sind gespannt darauf, dass Sie sie ausprobieren!
Wie in den obigen Inhalten verlinkt, sind die besten Anlaufstellen, um mehr darüber zu erfahren, was in Features enthalten ist und wie man sie verteilt, die Seiten Features und Features-Verteilung der Dev Container-Spezifikation.
Wir freuen uns auf Ihr Feedback, während Sie Features nutzen, erstellen und veröffentlichen – wir würden gerne hören, wie sie für Sie funktionieren, in den Issue-Vorschlägen zu Features und Features-Verteilung.
Wenn Sie daran interessiert sind, sich an der Spezifikation insgesamt zu beteiligen oder ein anderes Tool dafür zu integrieren, schauen Sie sich die Repositorys der Dev Container Spezifikation und CLI an.
Viel Spaß beim Erstellen von Dev Containern und beim Codieren!
Brigit Murtaugh, @BrigitMurtaugh