7.6 KiB
Advanced Dev Container Usage
This guide covers advanced topics for power users who want to customize and extend their devcontainer setup.
Table of Contents
- Customizing the Container
- Working with Multiple Containers
- Adding Custom Features
- VS Code Customization
- Performance Tuning
- Backup and Migration
- Development Workflows
Customizing the Container
Persistent Dotfiles
Learn more about personalizing with dotfiles →
Always Installed Features
Learn more about adding a set of personalized features
Working with Multiple Containers
Running Multiple Instances
You can run multiple devcontainers for different branches:
# Clone same repo with different volume names
Dev Containers: Clone Repository in Named Container Volume...
# Volume 1: mongo-main
# Volume 2: mongo-feature-branch
# Volume 3: mongo-bugfix
Each gets its own:
- Container instance
- Cache volume
- Python venv
Switch between them:
- VS Code → File → Recent
- Select the container you want
EngFlow Telemetry
The devcontainer automatically reports metadata to EngFlow via Bazel keywords:
# These are added automatically in Dockerfile and postCreateCommand
common --bes_keywords=devcontainer:use=true
common --bes_keywords=devcontainer:image=<image_tag>
common --bes_keywords=devcontainer:docker_server_platform=<platform>
This helps the team understand devcontainer adoption and troubleshoot issues.
Adding Custom Features
Creating a Custom Feature
Features are modular additions to your devcontainer. Create one:
mkdir -p .devcontainer/features/my-feature
cd .devcontainer/features/my-feature
Create devcontainer-feature.json:
{
"id": "my-feature",
"version": "1.0.0",
"name": "My Custom Feature",
"description": "Adds my custom tools and configuration",
"options": {
"version": {
"type": "string",
"default": "latest",
"description": "Version to install"
}
}
}
Create install.sh:
#!/usr/bin/env bash
set -e
VERSION="${VERSION:-latest}"
echo "Installing my-feature version $VERSION..."
# Your installation logic here
apt-get update
apt-get install -y my-package
echo "my-feature installation complete!"
Note: Custom features are typically contributed to the main devcontainer configuration through pull requests rather than added individually.
Example: MongoDB Compass Feature
# .devcontainer/features/compass/install.sh
#!/usr/bin/env bash
set -e
echo "Installing MongoDB Compass..."
wget https://downloads.mongodb.com/compass/mongodb-compass_latest_amd64.deb
sudo dpkg -i mongodb-compass_latest_amd64.deb || true
sudo apt-get install -f -y
rm mongodb-compass_latest_amd64.deb
echo "Compass installed!"
Example: Database Tools Feature
# .devcontainer/features/db-tools/install.sh
#!/usr/bin/env bash
set -e
echo "Installing MongoDB Database Tools..."
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-x86_64-100.9.4.deb
sudo dpkg -i mongodb-database-tools-*.deb
rm mongodb-database-tools-*.deb
echo "Database tools installed: mongodump, mongorestore, etc."
VS Code Customization
User-Specific Settings
Override devcontainer settings in user settings.json.
Learn more about container-specific settings →
{
// Your personal preferences
"editor.fontSize": 14,
"editor.tabSize": 2,
"terminal.integrated.fontSize": 13,
// Override theme
"workbench.colorTheme": "Monokai",
// Additional formatters
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
Additional Extensions
Install extra extensions without modifying devcontainer.json:
# Via command line
code --install-extension ms-vscode.hexeditor
# Or manually in Extensions panel
Port Forwarding
VS Code automatically forwards ports from the container to your host machine. When a service listens on a port inside the container, VS Code detects it and makes it accessible from your browser.
# Start mongod on default port 27017
./bazel-bin/src/mongo/mongod --dbpath /data/db
# VS Code will automatically forward port 27017
# Access from host: localhost:27017
Manual port forwarding:
- Click on the Ports tab in VS Code terminal panel
- Add port → Enter port number
- Access forwarded ports from your host browser or tools
- Note: Some firewall configurations may block forwarded ports
Learn more about port forwarding →
Performance Tuning
Docker Performance
macOS:
- Use VirtioFS instead of osxfs (Docker Desktop 4.6+)
- Settings → Experimental → VirtioFS
All platforms:
- Allocate as many resources as possible to Docker (see Getting Started)
- Use named volumes (not bind mounts)
- Enable BuildKit (for faster image builds):
export DOCKER_BUILDKIT=1
File Watching
Reduce file watcher overhead:
// Add to VS Code settings.json
{
"files.watcherExclude": {
"**/bazel-*/**": true,
"**/node_modules/**": true,
"**/.cache/**": true,
"**/python3-venv/**": true
}
}
Backup and Migration
Backing Up Volumes
# Backup a volume to tarball
docker run --rm \
-v engflow_auth:/data \
-v $(pwd):/backup \
ubuntu tar czf /backup/engflow_auth_backup.tar.gz -C /data .
# Backup all MongoDB dev volumes
for vol in engflow_auth mongo-cache mongo-python3-venv; do
docker run --rm \
-v $vol:/data \
-v $(pwd):/backup \
ubuntu tar czf /backup/${vol}_backup.tar.gz -C /data .
done
Restoring Volumes
# Create volume
docker volume create engflow_auth
# Restore from backup
docker run --rm \
-v engflow_auth:/data \
-v $(pwd):/backup \
ubuntu tar xzf /backup/engflow_auth_backup.tar.gz -C /data
Migrating to New Machine
Option 1: Export and Import Volumes
On old machine:
# Backup volumes (see above)
# Copy .tar.gz files to new machine
On new machine:
# Restore volumes (see above)
# Clone repository and open devcontainer
Option 2: Use Docker Save/Load
# Old machine: Save container image
docker save -o mongo-devcontainer.tar <image_id>
# New machine: Load image
docker load -i mongo-devcontainer.tar
Development Workflows
Debugging Workflow
With GDB:
# Build with debug symbols
bazel build --config=dbg install-mongod
# Run with GDB
gdb bazel-bin/install-mongod/bin/mongod
(gdb) run --dbpath /data/db
(gdb) break my_function
(gdb) continue
Tips and Tricks
Quick Commands
# Rebuild devcontainer from terminal
# Cmd/Ctrl+Shift+P → "Dev Containers: Rebuild Container"
# Attach to running container
docker exec -it <container_name> /bin/bash
# Copy compile_commands.json to host (for external IDE)
docker cp <container_id>:/workspaces/mongo/compile_commands.json ~/Desktop/
# Check what's using disk space
du -sh ~/.cache/*
du -sh /opt/mongodbtoolchain/*
See Also:
- Architecture - How it all works
- Troubleshooting - Fix issues
- FAQ - Common questions