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 |