mongo/docs/devcontainer/advanced.md

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

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: