Tooling · 2 Min. Lesezeit

Dev Containers: Reproduzierbare Entwicklungsumgebungen mit Docker

Wie man mit VS Code Dev Containers und Docker Compose konsistente, teilbare Entwicklungsumgebungen erstellt, die einfach funktionieren.

Dev Containers: Reproduzierbare Entwicklungsumgebungen mit Docker

„Funktioniert auf meinem Rechner” ist der älteste Witz in der Software-Entwicklung — und Dev Containers sind das Nächste, was wir an einer echten Lösung haben.

Das Problem

Jeder Entwickler im Team hat ein leicht anderes Setup. Verschiedene Node-Versionen, verschiedene Python-Umgebungen, verschiedene Datenbank-Konfigurationen. Das Onboarding eines neuen Teammitglieds dauert Tage mit „installier dies, konfiguriere das, oh warte, du brauchst diese Version.”

Dev Containers als Lösung

Ein Dev Container ist ein Docker-Container, der speziell für die Entwicklung konfiguriert ist. VS Code (und andere Editoren) können dein Projekt innerhalb des Containers öffnen und bieten dir:

  • Exakt die gleiche Umgebung für jeden Entwickler
  • Vorinstallierte Tools — kein „bitte installiere Go 1.22” mehr
  • Isolierte Abhängigkeiten — keine Konflikte zwischen Projekten
  • Onboarding in Minuten — klonen, öffnen, fertig

Ein praktisches Setup

Hier ist eine .devcontainer/devcontainer.json für ein typisches Node.js-Projekt:

{
  "name": "Mein Projekt",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace",
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "bradlc.vscode-tailwindcss"
      ]
    }
  },
  "postCreateCommand": "pnpm install"
}

Kombiniert mit einer docker-compose.yml, die deine Datenbank enthält:

services:
  app:
    build: .
    volumes:
      - ..:/workspace:cached
    command: sleep infinity
  db:
    image: postgres:16
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: dev

Tipps aus dem Produktionseinsatz

Nutze Volume-Mounts klug. Das :cached-Flag unter macOS macht einen enormen Unterschied für die Dateisystem-Performance.

Baue deine Images vor. Installiere nicht alles in postCreateCommand. Packe gängige Tools in das Docker-Image, damit der Container-Start schnell ist.

Formatter-Config einschließen. Wenn ESLint und Prettier im Container mit gepinnten Versionen laufen, verschwinden Formatierungs-Debatten.

GPU-Passthrough nicht vergessen. Für ML-Arbeit unterstützen Dev Containers GPU-Zugriff über das --gpus-Flag.

Wann man sie nicht nutzen sollte

Für einfache Projekte mit minimalen Abhängigkeiten fügen Dev Containers unnötige Komplexität hinzu. Eine .tool-versions-Datei mit asdf oder mise reicht möglicherweise aus. Nutze Dev Containers, wenn der Setup-Aufwand hoch und das Team größer als zwei Personen ist.