Aller au contenu

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

// devcontainer.json
{
  "remoteEnv": {
    "API_KEY": "${localEnv:API_KEY}"
  }
}

Option 2 : Fichier .env ignore par Git

// devcontainer.json
{
  "runArgs": ["--env-file", ".devcontainer/.env"]
}
# .devcontainer/.env (dans .gitignore)
API_KEY=my-secret-key
DATABASE_URL=postgres://localhost:5432/mydb
# .gitignore
.devcontainer/.env

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
// settings.json VS Code
{
  "dev.containers.dockerPath": "podman"
}

Performance sur macOS

Sur macOS, Podman utilise une VM. Configurez la avec suffisamment de ressources :

podman machine init --cpus 4 --memory 8192 --disk-size 50
podman machine start

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
  • postCreateCommand idempotent
  • Image de base adaptée (pas alpine sauf besoin spécifique)
  • forwardPorts documentes avec labels
  • .devcontainer/.env dans .gitignore