Aller au contenu

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 :

{
  "postCreateCommand": "bash .devcontainer/post-create.sh"
}
#!/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/
├── devcontainer.json
└── docker-compose.yml
# .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:
// .devcontainer/devcontainer.json
{
  "name": "Full Stack",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace"
}