# Getting Started with MongoDB Dev Containers This guide will walk you through setting up your MongoDB development environment using Dev Containers. ## Prerequisites ### 1. Install Docker Dev Containers require Docker to be installed and running on your system. Choose one of the following Docker providers: #### Option A: Rancher Desktop (Recommended) [Rancher Desktop](https://rancherdesktop.io/) is our recommended Docker provider for devcontainer development. **Installation:** 1. Download and install Rancher Desktop from [rancherdesktop.io](https://rancherdesktop.io/) 2. On first launch, configure these settings: - **Kubernetes**: Choose any option (not required for devcontainers) - **Container Engine**: Select `dockerd (moby)` ⚠️ **Important!** - **Configure Path**: Select "Automatic" **Recommended Settings:** After installation, increase resources for better build performance: 1. Open Rancher Desktop → Preferences → Virtual Machine 2. **Memory**: Allocate as much as your system allows (leave ~4-8 GB for your host OS) 3. **CPUs**: Allocate as many cores as possible (leave 1-2 for your host OS) 4. **Disk**: Rancher Desktop doesn't have a UI for disk size. To increase it, see [Troubleshooting - Increase Docker disk allocation](./troubleshooting.md#build-fails-with-no-space-left-on-device) for instructions. 5. Apply changes and restart Rancher Desktop > **Tip:** More resources = faster builds. MongoDB builds benefit significantly from additional CPU cores and memory. **IMPORTANT!**: If you already have VSCode open when you install Rancher Desktop, make sure to restart VSCode otherwise it may not find the Docker socket and VSCode will prompt you to install Docker Desktop instead. #### Option B: Docker Desktop [Docker Desktop](https://www.docker.com/products/docker-desktop/) is a popular alternative. > **Note on Licensing**: Docker Desktop may require a paid license for commercial use. Please review the licensing terms to ensure compliance with your use case. **Installation:** 1. Download from [docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop/) 2. Install and start Docker Desktop 3. Go to Settings → Resources and allocate generously: - **Memory**: Allocate as much as possible (leave ~4-8 GB for your host OS) - **CPUs**: Allocate as many cores as possible (leave 1-2 for your host OS) - **Disk**: Ensure plenty of space available (60+ GB recommended) #### Option C: OrbStack (macOS) [OrbStack](https://orbstack.dev/) is a lightweight, fast Docker alternative for macOS. > **Note on Licensing**: OrbStack may require a paid license for commercial use. Please review the licensing terms to ensure compliance with your use case. **Installation:** 1. Download from [orbstack.dev](https://orbstack.dev/) 2. Install and launch OrbStack 3. OrbStack automatically manages resources efficiently #### Option D: Docker Engine (Linux only) For Linux users, you can use Docker Engine directly. **Installation:** Follow the official guide: [docs.docker.com/engine/install](https://docs.docker.com/engine/install/) ### 2. Create SSH Directory (Required) > **⚠️ Critical:** You **must** have a `~/.ssh` directory on your host machine before building the devcontainer. The devcontainer requires this directory to exist, regardless of whether you use SSH or HTTPS to clone the repository. ```bash # On your HOST machine (not inside the container) mkdir -p ~/.ssh ``` If you skip this step, you'll encounter bind mount errors when trying to start the devcontainer. ### 3. Install Visual Studio Code Download and install VS Code from [code.visualstudio.com](https://code.visualstudio.com/) ### 4. Install Dev Containers Extension 1. Open VS Code 2. Go to Extensions (⌘/Ctrl+Shift+X) 3. Search for "Dev Containers" 4. Install the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension by Microsoft ### 5. Configure SSH Keys (Recommended) To clone the repository using SSH (recommended for contributors), you'll need SSH keys configured with GitHub. > **⚠️ Important:** Run all commands in this section on your **host machine** (not inside the container). SSH keys need to be set up before cloning the repository into the container. #### Check if you have SSH keys ```bash # Check for existing SSH keys ls -la ~/.ssh/id_*.pub # If you see id_rsa.pub, id_ed25519.pub, or similar, you have keys ``` #### Generate SSH keys (if needed) If you don't have SSH keys, generate them: ```bash # Generate a new ED25519 key (recommended) ssh-keygen -t ed25519 -C "your_email@example.com" # Or generate RSA key (if ED25519 not supported) ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # Press Enter to accept default location # Enter a passphrase (recommended) or press Enter for no passphrase ``` #### Add SSH key to GitHub 1. **Copy your public key:** ```bash # For ED25519 cat ~/.ssh/id_ed25519.pub # For RSA cat ~/.ssh/id_rsa.pub ``` 2. **Add to GitHub:** - Go to [GitHub SSH Settings](https://github.com/settings/keys) - Click "New SSH key" - Paste your public key - Give it a descriptive title (e.g., "Work Laptop") - Click "Add SSH key" 3. **Test your connection:** ```bash ssh -T git@github.com # Should see: "Hi username! You've successfully authenticated..." ``` #### SSH Agent (for keys with passphrases) If your SSH key has a passphrase, add it to the SSH agent: ```bash # Start ssh-agent (macOS/Linux) eval "$(ssh-agent -s)" # Add your key to the agent ssh-add ~/.ssh/id_ed25519 # or id_rsa # Verify key is loaded ssh-add -l ``` **macOS users:** Add this to `~/.ssh/config` to automatically load keys: ``` Host * AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_ed25519 ``` For passphrase-protected keys, also add to `~/.zshrc` or `~/.bashrc`: ```bash ssh-add --apple-use-keychain ~/.ssh/id_ed25519 2>/dev/null ``` **Windows users:** The ssh-agent service should start automatically. If not: ```powershell # In PowerShell (as Administrator) Get-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent ``` > **Note:** VS Code automatically forwards your SSH agent to the container, so your keys will be available inside the devcontainer. [Learn more about using SSH keys with GitHub →](https://docs.github.com/en/authentication/connecting-to-github-with-ssh) ## Setup Instructions ### Step 1: Clone Repository in Named Container Volume For **optimal performance**, especially on macOS, clone the repository directly into a Docker volume rather than your local filesystem. This is crucial for Bazel performance. #### Why Named Volumes? - ✅ **Better I/O Performance**: Native filesystem speed inside container - ✅ **Bazel Compatibility**: Avoids macOS filesystem case-sensitivity issues - ✅ **Consistent Behavior**: Same experience across all platforms - ✅ **Isolation**: Keeps container data separate from host #### Cloning Steps: 1. **Open VS Code Command Palette** - macOS: `Cmd+Shift+P` - Windows/Linux: `Ctrl+Shift+P` 2. **Run Clone Command** - Type: `Dev Containers: Clone Repository in Named Container Volume...` - Select it from the list - [Learn more about improving performance with container volumes →](https://code.visualstudio.com/remote/advancedcontainers/improve-performance#_use-a-targeted-named-volume) 3. **Enter Repository URL** ##### For use with the internal mongodb repo: ``` git@github.com:10gen/mongo.git ``` Or use HTTPS: ``` https://github.com/mongodb/mongo.git ``` ##### For use with the public mongodb repo: ``` git@github.com:mongodb/mongo.git ``` Or use HTTPS: ``` https://github.com/mongodb/mongo.git ``` > **Tip**: SSH URLs are recommended if you have SSH keys configured 4. **Choose Volume Name** - Enter a name like: `mongo-workspace` - This creates a Docker volume with that name - You can reference it later: `docker volume ls` 5. **Wait for Initial Setup** - VS Code will: - Clone the repository to the volume - Build the devcontainer image - Start the container - Install VS Code extensions - Run post-creation commands ### Step 2: Verify Your Setup Let's make sure everything is working correctly. #### 2.1 Check Toolchain Installation ```bash # Verify GCC version gcc --version # Verify Python version python3 --version ``` #### 2.2 Verify Python Virtual Environment The devcontainer automatically sets up a Python virtual environment: ```bash # Should already be activated (check for (python3-venv) in prompt) which python # Should show: /workspaces/mongo/python3-venv/bin/python # Check poetry is available poetry --version ``` #### 2.3 Test Bazel Build Try building a target: ```bash bazel build install-mongod ``` This may take a while on first run but verifies: - Bazel is configured correctly - Toolchain is working - Build system is functional #### 2.4 Check VS Code Extensions The following extensions should be installed and active: - clangd (C++ IntelliSense) - ESLint (JavaScript linting) - Ruff (Python formatting) - Bazel (Build system support) Check: View → Extensions and verify they're enabled. ### Step 3: Understanding Your Environment #### Workspace Location Your code lives in a Docker volume, not your local filesystem. To access it: - **Inside Container**: `/workspaces/mongo` (default workspace folder) #### Persistent Volumes Several volumes persist data across container restarts: 1. **`engflow_auth`** → `~/.config/engflow_auth` - EngFlow remote execution credentials - Survives container rebuilds 2. **`mongo-cache`** → `~/.cache` - Bazel cache - Tool caches - Significantly speeds up rebuilds 3. **`mongo-python3-venv`** → `/workspaces/mongo/python3-venv` - Python virtual environment - Poetry-managed dependencies - Persists across container updates 4. **`mongo-bashhistory`** → `/commandhistory` - Terminal command history - Available across sessions #### Data Directory MongoDB data directory is automatically created at `/data/db` with proper permissions. ## Next Steps ### Explore the Documentation - [Architecture Details](./architecture.md) - Learn how the devcontainer works - [Advanced Usage](./advanced.md) - Customize and extend your setup - [Troubleshooting](./troubleshooting.md) - Fix common issues ## Common First-Time Issues ### SSH Clone Fails **Problem**: Clone fails with "Permission denied (publickey)" or "git@github.com: Permission denied" **Solution**: ```bash # Test SSH connection from your HOST machine (before starting container) ssh -T git@github.com # If this fails, your SSH keys aren't set up correctly # Follow the SSH key setup instructions above # Check if ssh-agent has your key ssh-add -l # If empty, add your key ssh-add ~/.ssh/id_ed25519 # or id_rsa # If you see "Could not open a connection to your authentication agent" eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ``` ### SSH Works Locally But Not in Container **Problem**: SSH works on your host machine but fails inside the container **Cause**: SSH agent forwarding may not be working **Solution**: ```bash # On your HOST machine, ensure ssh-agent is running with your keys ssh-add -l # Should list your keys # If not listed, add them ssh-add ~/.ssh/id_ed25519 # In VS Code, rebuild the container # Command Palette → "Dev Containers: Rebuild Container" ``` **VS Code SSH Agent Forwarding**: The Dev Containers extension automatically forwards your SSH agent, but this requires: - SSH agent running on host with keys loaded - SSH key files in default location (`~/.ssh/`) [Learn more about sharing git credentials →](https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials) ### Container Build Fails **Problem**: Docker build fails with "no space left on device" **Solution**: ```bash # Clean up Docker docker system prune # Increase Docker disk space in Docker Desktop/Rancher Desktop settings ``` ### Slow Performance on macOS **Problem**: Bazel builds are very slow **Solution**: - ✅ Ensure you cloned into a named volume (not bind mount) - ✅ Allocate more CPU/Memory to Docker - ✅ Use EngFlow remote execution (see [Advanced Usage](./advanced.md)) ### Python Virtual Environment Not Activated **Problem**: Python commands not found or using wrong version **Solution**: ```bash # Manually activate source /workspaces/mongo/python3-venv/bin/activate # Reinstall dependencies poetry install --no-root --sync ``` ### VS Code Extensions Not Working **Problem**: clangd, ESLint, or other extensions show errors **Solution**: ```bash # Rebuild compile_commands.json for clangd bazel build compiledb --config=local # Restart VS Code window # Cmd/Ctrl+Shift+P → "Developer: Reload Window" ``` ## Alternative Setup: Local Clone + Reopen in Container If you prefer to clone locally first (not recommended for best performance): 1. Clone the repository to your local machine: ```bash git clone git@github.com:10gen/mongo.git cd mongo ``` 2. Open in VS Code: ```bash code . ``` 3. Open Command Palette (`Cmd/Ctrl+Shift+P`) 4. Run: `Dev Containers: Reopen in Container` ⚠️ **Note**: This uses bind mounts and may have performance issues on macOS with Bazel. ## Getting Help - **Questions**: See the [FAQ](./faq.md) - **Issues**: Check [Troubleshooting Guide](./troubleshooting.md) - **Bug Reports**: Open an issue in the MongoDB repository --- **Next**: [Learn about the Architecture →](./architecture.md)