Bonnes pratiques¶
Images légères, gestion des secrets, performance et sécurité des devcontainers.
Images légères¶
Choisir la bonne image de base¶
| Image | Taille | Usage |
|---|---|---|
mcr.microsoft.com/devcontainers/base:ubuntu | ~800 Mo | Usage général (recommande) |
mcr.microsoft.com/devcontainers/base:debian | ~700 Mo | Similaire, base Debian |
mcr.microsoft.com/devcontainers/base:alpine | ~300 Mo | Leger mais compatibilité limitee (musl) |
| Image custom | Variable | Équipes avec besoins spécifiques |
Alpine et glibc
Alpine utilise musl au lieu de glibc. Certains outils de dev (extensions VS Code, binaires pre-compiles) peuvent ne pas fonctionner. Preferez Ubuntu/Debian pour le développement.
Layer caching¶
Ordonnez le Dockerfile pour maximiser le cache :
# 1. Dependances systeme (change rarement)
FROM mcr.microsoft.com/devcontainers/base:ubuntu
RUN apt-get update && apt-get install -y jq httpie \
&& rm -rf /var/lib/apt/lists/*
# 2. Outils de dev (change parfois)
# ... via features dans devcontainer.json
# 3. Configuration (change plus souvent)
COPY .devcontainer/config/ /home/vscode/.config/
Secrets¶
Ne jamais mettre de secrets dans l'image¶
# INTERDIT — le secret est dans une layer de l'image
RUN echo "API_KEY=secret" >> /etc/environment
ENV API_KEY=secret
COPY .env /app/.env
Approches securisees¶
Option 1 : Variables d'environnement locales
Option 2 : Fichier .env ignore par Git
# .devcontainer/.env (dans .gitignore)
API_KEY=my-secret-key
DATABASE_URL=postgres://localhost:5432/mydb
Option 3 : Monter un fichier de secrets
{
"mounts": [
"source=${localEnv:HOME}/.secrets/project.env,target=/run/secrets/project.env,type=bind,readonly"
]
}
Podman rootless comme backend¶
Podman rootless offre une sécurité supérieure :
- Pas de daemon root
- Le conteneur tourne avec les privileges de l'utilisateur
- Pas de risque d'escalade de privileges
Performance sur macOS
Sur macOS, Podman utilise une VM. Configurez la avec suffisamment de ressources :
Performance des volumes¶
Sur macOS et Windows, les montages de volumes entre l'hôte et le conteneur sont plus lents que sur Linux natif.
Optimisations :
{
// Montage cache (accepte un leger delai de synchronisation)
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
// Exclure les dossiers lourds du montage
"mounts": [
"source=node-modules,target=/workspace/node_modules,type=volume"
],
// Installer les dependances dans un volume (pas sur le montage hote)
"postCreateCommand": "npm install"
}
Checklist de review¶
Avant de commiter un devcontainer.json, vérifier :
- Pas de secrets dans la configuration
- Versions explicites pour les features
-
postCreateCommandidempotent - Image de base adaptée (pas alpine sauf besoin spécifique)
-
forwardPortsdocumentes avec labels -
.devcontainer/.envdans.gitignore