Aller au contenu

Fondamentaux

Comprendre pourquoi les environnements de développement reproductibles sont devenus essentiels et comment les devcontainers résolvent ce problème.


Le problème

"Ca marche sur ma machine" est la phrase la plus coûteuse en développement. Les causes :

Cause Exemple
Version différente Node 18 sur un poste, Node 20 sur un autre
Dependance manquante Bibliotheque système installee a la main et oubliee
Configuration OS macOS vs Linux vs WSL, chemins différents
État du poste Restes d'anciens projets qui interferent

Le coût est reel : des heures de debug, des bugs non reproductibles, un onboarding penible pour les nouveaux.

Les approches

Approche Principe Niveau d'isolation
Install locale Tout installer sur le poste Aucune
Gestionnaire de runtimes Isoler les versions par projet ((mise, nvm, pyenv...)) Partielle (runtimes)
Dev container Tout le dev dans un conteneur Totale
VM Machine virtuelle complète Totale (plus lourd)

Le devcontainer est le meilleur compromis : isolation totale sans la lourdeur d'une VM.

Qu'est-ce qu'un devcontainer ?

Un devcontainer est un conteneur Docker/Podman dans lequel VS Code (ou un IDE compatible) execute le code, le debugger, les extensions et le terminal :

graph TB
    subgraph "Machine locale"
        VSCode["VS Code (UI)"]
    end
    subgraph "Container"
        Server["VS Code Server"]
        Code["Code source (volume)"]
        Tools["Outils (node, python, go...)"]
        Ext["Extensions"]
    end
    VSCode <--> Server
    Server --> Code
    Server --> Tools
    Server --> Ext

Le développeur interagit avec VS Code normalement. Seul le backend (serveur de langage, terminal, debugger) tourne dans le conteneur.

La spécification devcontainer

La spécification est ouverte et maintenue par Microsoft en collaboration avec la communauté :

Élément Fichier Rôle
Configuration .devcontainer/devcontainer.json Image, extensions, settings, post-create commands
Dockerfile .devcontainer/Dockerfile Image personnalisee (optionnel)
Docker Compose .devcontainer/docker-compose.yml Multi-conteneur (optionnel)
Features Referencees dans devcontainer.json Modules réutilisables (Node, Python, Docker-in-Docker...)
// .devcontainer/devcontainer.json — minimal
{
  "name": "Mon Projet",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers/features/node:1": { "version": "20" },
    "ghcr.io/devcontainers/features/python:1": { "version": "3.12" }
  },
  "customizations": {
    "vscode": {
      "extensions": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
    }
  }
}

Concepts cles

Concept Définition
Image de base Image Docker sur laquelle le devcontainer est construit
Feature Module réutilisable qui ajoute un outil (Node, Python, Go, Docker...)
Volume Montage du code source local dans le conteneur
Port forwarding Accès aux ports du conteneur depuis la machine locale
Post-create command Commande exécutée apres la creation du conteneur (npm install, pip install...)
Lifecycle scripts onCreate, postCreate, postStart, postAttach — hooks à chaque étape