đ Retour au Sommaire
Maintenant que vous comprenez ce quâest un DevContainer et pourquoi câest utile, il est temps de dĂ©couvrir comment crĂ©er et configurer un DevContainer. Tout commence par un fichier spĂ©cial : le fichier .devcontainer.json.
Ce fichier est comme la recette de votre environnement de dĂ©veloppement. Il dĂ©crit prĂ©cisĂ©ment ce qui doit ĂȘtre installĂ©, configurĂ© et activĂ© dans votre conteneur.
Analogie : Si le DevContainer est une maison, le fichier .devcontainer.json est le plan architectural qui spécifie :
Le fichier .devcontainer.json doit ĂȘtre placĂ© dans un dossier spĂ©cial Ă la racine de votre projet.
mon-projet-c/
âââ .devcontainer/
â âââ devcontainer.json â Le fichier de configuration
â âââ Dockerfile â (Optionnel) Image Docker personnalisĂ©e
âââ src/
â âââ main.c
âââ include/
â âââ header.h
âââ Makefile
âââ README.md
Note : Le dossier sâappelle .devcontainer (avec un point au dĂ©but, ce qui le rend « cachĂ© » sous Linux).
VS Code accepte aussi ces emplacements :
# Variante 1 : Dossier .devcontainer avec fichier dedans
.devcontainer/devcontainer.json
# Variante 2 : Fichier directement Ă la racine
.devcontainer.json
# Variante 3 : Pour plusieurs configurations
.devcontainer/gcc11/devcontainer.json
.devcontainer/gcc12/devcontainer.json
Recommandation pour dĂ©buter : Utilisez la variante 1 (.devcontainer/devcontainer.json), câest la plus propre et Ă©volutive.
Commençons par le strict minimum pour avoir un DevContainer fonctionnel.
{
"name": "Mon projet C",
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04"
}
Câest tout ! Avec juste ces deux lignes, vous avez un DevContainer fonctionnel.
Explications :
name : Le nom de votre environnement (affichĂ© dans VS Code)image : Lâimage Docker Ă utiliser (ici, une image prĂ©-configurĂ©e par Microsoft avec Ubuntu 22.04 et les outils C/C++)Quand VS Code ouvre ce DevContainer :
{
"name": "Environnement C - GCC 11",
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04",
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools"
]
}
}
}
Cette version ajoute automatiquement lâextension C/C++ de Microsoft dans le conteneur.
Voyons maintenant toutes les sections possibles dâun fichier .devcontainer.json pour comprendre ce quâon peut configurer.
{
// ============================================
// IDENTIFICATION
// ============================================
"name": "Nom affiché dans VS Code",
// ============================================
// IMAGE DE BASE
// ============================================
"image": "ubuntu:22.04",
// OU
"dockerFile": "Dockerfile",
// OU
"build": {
"dockerfile": "Dockerfile",
"context": "..",
"args": {
"VARIANT": "22.04"
}
},
// ============================================
// FONCTIONNALITĂS ADDITIONNELLES
// ============================================
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {},
"ghcr.io/devcontainers/features/git:1": {}
},
// ============================================
// CONFIGURATION VS CODE
// ============================================
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools",
"ms-vscode.cmake-tools"
],
"settings": {
"C_Cpp.default.cStandard": "c17",
"editor.formatOnSave": true
}
}
},
// ============================================
// MONTAGE DE VOLUMES
// ============================================
"mounts": [
"source=${localWorkspaceFolder}/data,target=/workspace/data,type=bind"
],
// ============================================
// PORTS
// ============================================
"forwardPorts": [8080, 3000],
"portsAttributes": {
"8080": {
"label": "Serveur Web",
"onAutoForward": "notify"
}
},
// ============================================
// COMMANDES DE CYCLE DE VIE
// ============================================
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y valgrind",
"postStartCommand": "echo 'Container started!'",
"postAttachCommand": "echo 'Welcome to your dev environment!'",
// ============================================
// UTILISATEUR
// ============================================
"remoteUser": "vscode",
"containerUser": "vscode",
// ============================================
// VARIABLES D'ENVIRONNEMENT
// ============================================
"remoteEnv": {
"MY_VAR": "valeur",
"PATH": "${containerEnv:PATH}:/custom/path"
},
// ============================================
// OPTIONS DOCKER
// ============================================
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined"
],
// ============================================
// AUTRES OPTIONS
// ============================================
"shutdownAction": "stopContainer",
"updateContentCommand": "make clean && make",
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
"workspaceFolder": "/workspace"
}
Rassurez-vous ! Vous nâavez pas besoin dâutiliser toutes ces options. Voyons maintenant chaque section en dĂ©tail.
{
"name": "Environnement C - Ubuntu 22.04 GCC 11"
}
Le nom qui apparaĂźt dans VS Code pour identifier votre DevContainer.
Bonnes pratiques :
Câest la partie la plus importante. Elle dĂ©finit le systĂšme dâexploitation et les outils de base de votre conteneur.
{
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04"
}
Images officielles Microsoft pour C/C++ :
mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04 - Ubuntu 22.04mcr.microsoft.com/devcontainers/cpp:ubuntu-20.04 - Ubuntu 20.04mcr.microsoft.com/devcontainers/cpp:debian-11 - Debian 11Ces images contiennent déjà :
{
"image": "ubuntu:22.04"
}
Câest une image Ubuntu « pure » sans outils de dĂ©veloppement prĂ©-installĂ©s. Vous devrez tout installer vous-mĂȘme.
{
"build": {
"dockerfile": "Dockerfile",
"context": ".."
}
}
Cette option vous donne le contrÎle total sur ce qui est installé. Nous verrons cela en détail dans la section 2.5.3.
Les features sont des modules pré-packagés que vous pouvez ajouter facilement à votre conteneur.
Analogie : Câest comme des « packs dâoptions » pour une voiture. Au lieu de tout installer manuellement, vous cochez des cases pour ajouter la climatisation, le GPS, etc.
{
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"installOhMyZsh": true
},
"ghcr.io/devcontainers/features/git:1": {
"version": "latest"
}
}
}
{
"features": {
// Outils systĂšme communs (zsh, curl, etc.)
"ghcr.io/devcontainers/features/common-utils:2": {},
// Git avec configuration
"ghcr.io/devcontainers/features/git:1": {
"version": "latest",
"ppa": false
},
// Docker-in-Docker (pour créer des images dans le container)
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
// Node.js (utile pour certains outils)
"ghcr.io/devcontainers/features/node:1": {
"version": "18"
},
// Python (pour scripts d'automatisation)
"ghcr.io/devcontainers/features/python:1": {
"version": "3.11"
}
}
}
Avantage des features : Elles sont maintenues par la communautĂ©, documentĂ©es et testĂ©es. Câest plus simple que dâinstaller manuellement.
Liste complĂšte : https://containers.dev/features
Cette section configure VS Code Ă lâintĂ©rieur du conteneur.
{
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools", // IntelliSense C/C++
"ms-vscode.cpptools-extension-pack",
"ms-vscode.cmake-tools", // Support CMake
"twxs.cmake", // Coloration CMakeLists.txt
"ms-vscode.makefile-tools", // Support Makefile
"usernamehw.errorlens", // Erreurs visibles
"oderwat.indent-rainbow", // Indentation colorée
"streetsidesoftware.code-spell-checker" // Correcteur
]
}
}
}
Note importante : Ces extensions sont installées dans le conteneur, pas sur votre machine hÎte. Si vous travaillez sur 3 projets avec 3 DevContainers différents, chacun peut avoir ses propres extensions.
{
"customizations": {
"vscode": {
"settings": {
// Configuration C/C++
"C_Cpp.default.cStandard": "c17",
"C_Cpp.default.compilerPath": "/usr/bin/gcc",
"C_Cpp.default.intelliSenseMode": "linux-gcc-x64",
// Ăditeur
"editor.formatOnSave": true,
"editor.tabSize": 4,
"editor.insertSpaces": true,
// Fichiers
"files.eol": "\n",
"files.trimTrailingWhitespace": true,
// Terminal
"terminal.integrated.defaultProfile.linux": "bash"
}
}
}
}
Ces paramÚtres sont appliqués automatiquement quand vous ouvrez le DevContainer.
Ces commandes sâexĂ©cutent automatiquement Ă diffĂ©rents moments de la vie du conteneur.
{
"postCreateCommand": "commande exécutée UNE FOIS aprÚs création du conteneur",
"postStartCommand": "commande exécutée à CHAQUE démarrage du conteneur",
"postAttachCommand": "commande exécutée quand VS Code se connecte",
"updateContentCommand": "commande pour mettre Ă jour le contenu",
"initializeCommand": "commande AVANT de créer le conteneur (sur l'hÎte)"
}
{
// Installer des outils aprÚs création
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y valgrind gdb",
// Compiler le projet au démarrage
"postStartCommand": "make clean && make",
// Message de bienvenue
"postAttachCommand": "echo 'Bienvenue ! GCC version :' && gcc --version",
// Mise à jour des dépendances
"updateContentCommand": "git submodule update --init --recursive"
}
Pour exécuter plusieurs commandes, utilisez && ou créez un script :
{
// Plusieurs commandes en une ligne
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y valgrind && pip3 install conan",
// OU : Appeler un script
"postCreateCommand": "bash .devcontainer/setup.sh"
}
Contenu de .devcontainer/setup.sh :
#!/bin/bash
echo "Configuration de l'environnement..."
sudo apt-get update
sudo apt-get install -y valgrind clang-format
pip3 install conan
echo "â Configuration terminĂ©e !"
Si vous développez un serveur ou une application réseau, vous devez exposer les ports.
{
"forwardPorts": [8080, 3000, 5000]
}
Ces ports du conteneur seront accessibles depuis votre machine hĂŽte.
Exemple : Vous lancez un serveur HTTP sur le port 8080 dans le conteneur. GrĂące Ă forwardPorts, vous pouvez y accĂ©der via http://localhost:8080 depuis votre navigateur sur lâhĂŽte.
{
"forwardPorts": [8080],
"portsAttributes": {
"8080": {
"label": "Serveur Web",
"onAutoForward": "notify",
"protocol": "http"
}
}
}
VS Code affichera une notification quand le port 8080 est utilisĂ© et vous proposera dâouvrir le navigateur.
Les mounts permettent de partager des dossiers entre lâhĂŽte et le conteneur.
{
"mounts": [
"source=${localWorkspaceFolder}/data,target=/workspace/data,type=bind"
]
}
Explication :
source : Chemin sur votre machine hĂŽtetarget : Chemin dans le conteneurtype=bind : Type de montage (gĂ©nĂ©ralement « bind »)${localWorkspaceFolder} : Le dossier de votre projet sur lâhĂŽte${localWorkspaceFolderBasename} : Le nom du dossier${containerWorkspaceFolder} : Le dossier dans le conteneur{
"mounts": [
// Partager un cache de compilation
"source=${localWorkspaceFolder}/.cache,target=/workspace/.cache,type=bind",
// Partager des données de test
"source=${localWorkspaceFolder}/test-data,target=/data,type=bind,readonly",
// Partager la config Git (pour ne pas la reconfigurer)
"source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind"
]
}
DĂ©finissez des variables dâenvironnement dans le conteneur.
{
"remoteEnv": {
"PROJECT_NAME": "mon-projet-c",
"COMPILER": "gcc",
"BUILD_TYPE": "Debug",
"PATH": "${containerEnv:PATH}:/custom/bin"
}
}
Ces variables seront disponibles dans tous les terminaux du conteneur.
Utilisation dans le conteneur :
echo $PROJECT_NAME # Affiche : mon-projet-c
echo $COMPILER # Affiche : gcc
Définit quel utilisateur est utilisé dans le conteneur.
{
"remoteUser": "vscode",
"containerUser": "vscode"
}
Explications :
remoteUser : Lâutilisateur avec lequel VS Code se connectecontainerUser : Lâutilisateur qui exĂ©cute les processusPourquoi câest important :
rootvscode est créé par les images Microsoft et a les bonnes permissionsRecommandation : Gardez "remoteUser": "vscode" si vous utilisez une image Microsoft.
Arguments passés à la commande docker run.
{
"runArgs": [
"--cap-add=SYS_PTRACE", // Nécessaire pour GDB
"--security-opt",
"seccomp=unconfined", // Désactive seccomp (pour debugging)
"--memory=4g", // Limite la RAM Ă 4 GB
"--cpus=2" // Limite Ă 2 CPUs
]
}
Pour le développement C, ces options sont souvent nécessaires :
{
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt", "seccomp=unconfined"
]
}
Elles permettent Ă GDB de fonctionner correctement (attacher Ă des processus, placer des breakpoints, etc.).
Voici un exemple complet et réaliste pour un projet C.
{
// ============================================
// IDENTIFICATION
// ============================================
"name": "Projet C - Ubuntu 22.04 - GCC 11",
// ============================================
// IMAGE DE BASE
// ============================================
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04",
// ============================================
// FEATURES
// ============================================
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"installOhMyZsh": true,
"upgradePackages": true
},
"ghcr.io/devcontainers/features/git:1": {
"version": "latest"
}
},
// ============================================
// CUSTOMIZATIONS VS CODE
// ============================================
"customizations": {
"vscode": {
"extensions": [
// C/C++ essentiels
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
// Build systems
"ms-vscode.cmake-tools",
"ms-vscode.makefile-tools",
// Qualité de code
"usernamehw.errorlens",
"oderwat.indent-rainbow",
// Git
"eamodio.gitlens",
// Utilitaires
"streetsidesoftware.code-spell-checker",
"gruntfuggly.todo-tree"
],
"settings": {
// C/C++
"C_Cpp.default.cStandard": "c17",
"C_Cpp.default.compilerPath": "/usr/bin/gcc",
"C_Cpp.default.intelliSenseMode": "linux-gcc-x64",
"C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: LLVM, IndentWidth: 4 }",
// Ăditeur
"editor.formatOnSave": true,
"editor.tabSize": 4,
"editor.insertSpaces": true,
"editor.rulers": [80, 120],
// Fichiers
"files.eol": "\n",
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
// Terminal
"terminal.integrated.defaultProfile.linux": "zsh"
}
}
},
// ============================================
// COMMANDES DE CYCLE DE VIE
// ============================================
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y valgrind clang-format && echo 'â Environnement prĂȘt !'",
// ============================================
// VARIABLES D'ENVIRONNEMENT
// ============================================
"remoteEnv": {
"CC": "gcc",
"CFLAGS": "-Wall -Wextra -std=c17"
},
// ============================================
// OPTIONS DOCKER
// ============================================
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt", "seccomp=unconfined"
],
// ============================================
// UTILISATEUR
// ============================================
"remoteUser": "vscode"
}
Avec ce fichier, quand vous ouvrez le projet dans VS Code :
{
"name": "Projet C - GCC 12",
"image": "ubuntu:22.04",
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {}
},
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y gcc-12 g++-12 make cmake gdb valgrind && sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100"
}
{
"name": "Projet C - Clang 14",
"image": "ubuntu:22.04",
"postCreateCommand": "sudo apt-get update && sudo apt-get install -y clang-14 lldb cmake make && sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-14 100",
"customizations": {
"vscode": {
"settings": {
"C_Cpp.default.compilerPath": "/usr/bin/clang"
}
}
}
}
{
"name": "Projet C - Alpine",
"image": "alpine:latest",
"postCreateCommand": "apk add --no-cache gcc musl-dev make cmake gdb"
}
Note : Alpine utilise musl libc au lieu de glibc. Valgrind ne supporte pas musl et ne fonctionnera pas sur Alpine. Si vous avez besoin de Valgrind, privilégiez une image basée sur Ubuntu ou Debian.
{
// Utilisez des commentaires pour expliquer les choix
"name": "Projet C",
// Ubuntu 22.04 pour GCC 11 et libc récente
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04",
// Extensions minimales pour ne pas alourdir
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools" // IntelliSense indispensable
]
}
}
}
Ce fichier doit ĂȘtre commitĂ© dans Git avec votre projet. Câest un fichier de configuration crucial.
git add .devcontainer/devcontainer.json
git commit -m "Add DevContainer configuration"
## Développement
Ce projet utilise un DevContainer pour garantir un environnement reproductible.
### Prérequis
- Docker
- VS Code avec l'extension "Dev Containers"
### Démarrage
1. Clonez le dépÎt
2. Ouvrez dans VS Code
3. Cliquez sur "Reopen in Container"
4. Attendez la fin de la configuration (premiĂšre fois : ~5 min)
L'environnement contient :
- Ubuntu 22.04
- GCC 11
- Make, CMake, GDB, Valgrind
Commencez avec une configuration minimale :
{
"name": "Mon projet",
"image": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04",
"customizations": {
"vscode": {
"extensions": ["ms-vscode.cpptools"]
}
}
}
Ajoutez des options au fur et à mesure des besoins réels.
Avant de partager votre DevContainer :
# Liste les conteneurs
docker ps -a
# Supprime un conteneur
docker rm <container-id>
# Supprime l'image
docker rmi <image-id>
Moins bien :
{
"postCreateCommand": "apt-get install -y git curl wget"
}
Mieux :
{
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {}
}
}
Les features sont plus robustes et mieux maintenues.
Le fichier .devcontainer.json doit ĂȘtre du JSON valide.
Erreurs fréquentes :
"value", (avant })VS Code vous aide : Si vous ouvrez le fichier dans VS Code, la coloration et les erreurs sâaffichent automatiquement.
VS Code peut valider automatiquement votre fichier contre le schéma officiel.
Ajoutez au début du fichier :
{
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json",
"name": "Mon projet"
}
Maintenant, VS Code vous proposera lâauto-complĂ©tion et validera la structure.
SymptÎme : VS Code affiche une erreur au démarrage.
Solutions :
docker psSymptĂŽme : Les extensions listĂ©es nâapparaissent pas.
Solutions :
publisher.extension-name)Ctrl+Shift+P â « Dev Containers: Rebuild Container »SymptĂŽme : La commande de post-crĂ©ation ne fonctionne pas.
Solutions :
sudo si nécessaire (droits admin)&&à ce stade, vous comprenez :
.devcontainer.jsonProchaine étape : Dans la section 2.5.3, nous verrons comment configurer spécifiquement GCC, GDB, CMake et Valgrind dans un DevContainer pour une expérience de développement optimale.
.devcontainer/devcontainer.json : Emplacement standard du fichiername + image suffisent pour commencermcr.microsoft.com/devcontainers/cpp:ubuntu-22.04 recommandée--cap-add=SYS_PTRACE)Citation :
« Configuration as code means your environment is documented, versioned, and reproducible. »
â DevOps best practices