Workflow quotidien¶
Utiliser les features, gérer les volumes et les ports, et reconstruire efficacement son devcontainer.
Features¶
Les features sont des modules réutilisables qui ajoutent des outils au devcontainer. Catalogue complet : containers.dev/features
{
"features": {
// Langages
"ghcr.io/devcontainers/features/node:1": { "version": "20" },
"ghcr.io/devcontainers/features/python:1": { "version": "3.12" },
"ghcr.io/devcontainers/features/go:1": { "version": "1.22" },
"ghcr.io/devcontainers/features/rust:1": { "version": "latest" },
// Outils
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {},
"ghcr.io/devcontainers/features/terraform:1": {},
// CLI
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/aws-cli:1": {}
}
}
Moins c'est mieux
Chaque feature ajoute du temps de build. N'ajoutez que les outils nécessaires au projet.
Volumes et persistance¶
Par defaut, le code source est monte dans le conteneur. Mais certaines données doivent persister entre les rebuilds :
{
"mounts": [
// Historique shell persistant
"source=devcontainer-zsh-history,target=/home/vscode/.zsh_history,type=volume",
// Cache npm persistant
"source=devcontainer-npm-cache,target=/home/vscode/.npm,type=volume",
// Configuration Git locale (lecture seule)
"source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind,readonly"
]
}
Port forwarding¶
{
// Ports toujours forwardes
"forwardPorts": [3000, 5432, 8080],
// Labels pour s'y retrouver
"portsAttributes": {
"3000": { "label": "Frontend", "onAutoForward": "notify" },
"5432": { "label": "PostgreSQL", "onAutoForward": "silent" },
"8080": { "label": "API", "onAutoForward": "openBrowser" }
}
}
VS Code détecte aussi automatiquement les ports ouverts dans le conteneur et propose de les forwarder.
Lifecycle scripts¶
{
// Execute une seule fois a la creation
"postCreateCommand": "npm install && npm run build",
// Execute a chaque demarrage du conteneur
"postStartCommand": "npm run dev &",
// Execute a chaque fois que VS Code s'attache
"postAttachCommand": "echo 'Bienvenue dans le devcontainer'"
}
Pour des scripts complexes, utilisez un fichier :
#!/bin/bash
# .devcontainer/post-create.sh
set -e
echo "=== Installation des dependances ==="
npm install
echo "=== Configuration de la base de donnees ==="
npm run db:migrate
echo "=== Pret ! ==="
Rebuild¶
| Action | Quand l'utiliser |
|---|---|
| Ctrl+Shift+P → "Rebuild Container" | Apres modification de devcontainer.json, Dockerfile ou features |
| Ctrl+Shift+P → "Rebuild Without Cache" | Quand le cache cause des problèmes |
Rebuild vs Recreate
"Rebuild" reconstruit l'image. Les volumes nommes (comme l'historique shell) sont preserves. Seul un "Rebuild Without Cache" force un telechargement complet.
Multi-conteneur avec Docker Compose¶
Pour un projet avec une base de données et un cache :
# .devcontainer/docker-compose.yml
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
command: sleep infinity
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: dev
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata: