# 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](#customizing-the-container) - [Working with Multiple Containers](#working-with-multiple-containers) - [Adding Custom Features](#adding-custom-features) - [VS Code Customization](#vs-code-customization) - [Performance Tuning](#performance-tuning) - [Backup and Migration](#backup-and-migration) - [Development Workflows](#development-workflows) ## Customizing the Container ### Persistent Dotfiles [Learn more about personalizing with dotfiles →](https://code.visualstudio.com/docs/devcontainers/containers#_personalizing-with-dotfile-repositories) ### Always Installed Features [Learn more about adding a set of personalized features](https://code.visualstudio.com/docs/devcontainers/containers#_always-installed-features) ## Working with Multiple Containers ### Running Multiple Instances You can run multiple devcontainers for different branches: ```bash # 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: ```bash # These are added automatically in Dockerfile and postCreateCommand common --bes_keywords=devcontainer:use=true common --bes_keywords=devcontainer:image= common --bes_keywords=devcontainer:docker_server_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: ```bash mkdir -p .devcontainer/features/my-feature cd .devcontainer/features/my-feature ``` **Create `devcontainer-feature.json`:** ```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`:** ```bash #!/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 ```bash # .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 ```bash # .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 →](https://code.visualstudio.com/docs/devcontainers/containers#_container-specific-settings) ```json { // 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`: ```bash # 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. ```bash # 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 →](https://code.visualstudio.com/docs/devcontainers/containers#_forwarding-or-publishing-a-port) ## 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](./getting-started.md)) - Use named volumes (not bind mounts) - Enable BuildKit (for faster image builds): ```bash export DOCKER_BUILDKIT=1 ``` ### File Watching Reduce file watcher overhead: ```json // Add to VS Code settings.json { "files.watcherExclude": { "**/bazel-*/**": true, "**/node_modules/**": true, "**/.cache/**": true, "**/python3-venv/**": true } } ``` ## Backup and Migration ### Backing Up Volumes ```bash # 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 ```bash # 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: ```bash # Backup volumes (see above) # Copy .tar.gz files to new machine ``` On new machine: ```bash # Restore volumes (see above) # Clone repository and open devcontainer ``` **Option 2: Use Docker Save/Load** ```bash # Old machine: Save container image docker save -o mongo-devcontainer.tar # New machine: Load image docker load -i mongo-devcontainer.tar ``` ## Development Workflows ### Debugging Workflow **With GDB:** ```bash # 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 ```bash # Rebuild devcontainer from terminal # Cmd/Ctrl+Shift+P → "Dev Containers: Rebuild Container" # Attach to running container docker exec -it /bin/bash # Copy compile_commands.json to host (for external IDE) docker cp :/workspaces/mongo/compile_commands.json ~/Desktop/ # Check what's using disk space du -sh ~/.cache/* du -sh /opt/mongodbtoolchain/* ``` --- **See Also:** - [Architecture](./architecture.md) - How it all works - [Troubleshooting](./troubleshooting.md) - Fix issues - [FAQ](./faq.md) - Common questions