Files
mongo/docs/devcontainer/faq.md
Eric Lavigne f268f17cc7 SERVER-112625: Update urls for clones to use the internal 10gen urls … (#42849)
GitOrigin-RevId: b83e0e91d0eaba9b17ffd0c376a2646ffe734c92
2025-10-21 06:01:43 +00:00

503 lines
12 KiB
Markdown

# Dev Container FAQ
Frequently asked questions about MongoDB development with dev containers.
## General Questions
### What is a dev container?
A dev container (development container) is a Docker container configured specifically for development. It includes:
- All build tools and dependencies
- IDE configuration and extensions
- Persistent storage for caches and settings
- Consistent environment across all developers
Think of it as a portable, reproducible development environment that runs on any machine with Docker.
[Learn more about dev containers →](https://containers.dev/)
### Is this production-ready or still experimental?
The MongoDB devcontainer is currently in **Beta**. This means:
- Core functionality works well
- Most developers can use it for daily work
- Some edge cases may need refinement
- Active development and improvements ongoing
Report issues to help improve it for everyone!
## Setup and Installation
### Do I need SSH keys to use devcontainers?
**No, but SSH is recommended** for contributors who will be pushing code.
**You can use:**
-**SSH** (recommended): `git@github.com:10gen/mongo.git`
- Pros: More secure, no password prompts, required for pushing code
- Requires: SSH keys configured with GitHub
-**HTTPS**: `https://github.com/mongodb/mongo.git`
- Pros: Works without SSH keys, simpler for read-only access
- Cons: May require password/token for push operations
See the [Getting Started guide SSH setup section](./getting-started.md#4-configure-ssh-keys-recommended) for details.
### How do SSH keys work with devcontainers?
VS Code automatically forwards your SSH agent to the container, so you don't need to copy keys into the container.
**Requirements:**
1. SSH keys must be on your **host machine** (not in container)
2. SSH agent must be running with keys loaded
3. Keys should be in default location (`~/.ssh/`)
**Verify on host before opening container:**
```bash
# Check ssh-agent has your keys
ssh-add -l
# Test GitHub connection
ssh -T git@github.com
```
**Inside the container**, Git commands will automatically use your host's SSH keys through agent forwarding.
[Learn more about SSH agent forwarding →](https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials)
### Why does git push ask for credentials in the container?
This usually means SSH agent forwarding isn't working.
**Fix:**
```bash
# On HOST machine (outside container):
# Ensure ssh-agent is running and has your key
ssh-add -l
# If empty, add your key
ssh-add ~/.ssh/id_ed25519 # or id_rsa
# Rebuild container to pick up agent forwarding
# Command Palette → "Dev Containers: Rebuild Container"
```
### Which Docker provider should I use?
**Recommended: Rancher Desktop**
- Free and open source
- Easy to configure
- Good performance
- Works well with devcontainers
**Alternatives:**
- Docker Desktop: Popular, user-friendly, requires license for large companies
- OrbStack (macOS): Lightweight, fast, newer
- Docker Engine (Linux): Direct, no GUI overhead
See [Getting Started](./getting-started.md#1-install-docker) for details.
### Why does the setup take so long?
First-time setup includes:
1. Downloading base image (~2 GB)
2. Building custom container (~5-10 min)
3. Downloading toolchain (~3 GB)
4. Installing Python dependencies (~5-10 min)
5. Building clangd index (~5 min)
**Total:** ~20-30 minutes depending on internet speed
**Subsequent rebuilds** are much faster due to Docker layer caching.
### Can I use this on Windows?
**Yes!** Requirements:
- Windows 10/11
- WSL2 installed and configured
- Docker Desktop with WSL2 integration enabled
**Important:** Clone repository in WSL2 filesystem (not `/mnt/c/`), not Windows filesystem, for best performance.
### Can I use this on Apple Silicon (M1/M2/M3)?
**Yes!** The devcontainer supports ARM64 architecture. Ensure:
- Docker provider supports ARM64 (Rancher Desktop, Docker Desktop do)
- Base image has ARM64 variant (current MongoDB image does)
- Rosetta 2 is enabled if needed (Rancher Desktop setting)
## Usage Questions
### Where is my code stored?
Your code lives in a **Docker volume**, not your local filesystem.
- **Inside container**: `/workspaces/mongo`
- **On host**: Managed by Docker (see `docker volume inspect <volume_name>`)
This is by design for performance, especially on macOS.
### How do I access files from my host OS?
**Option 1: Copy files out**
```bash
docker cp <container_id>:/workspaces/mongo/file.txt ~/Downloads/
```
**Option 2: Download from VS Code**
- Right-click file → Download...
**Option 3: Use bind mount** (sacrifices performance)
Open your existing local repository in VS Code and use "Dev Containers: Reopen in Container". This uses a bind mount which allows direct host filesystem access but is slower, especially on macOS.
### Can I use my existing local clone?
**Yes**, but not recommended for best performance.
**Option A: Reopen in container** (bind mount - slower)
1. Open your local repo in VS Code
2. Command Palette → "Dev Containers: Reopen in Container"
**Option B: Clone into volume** (recommended - faster)
1. Use "Clone Repository in Named Container Volume"
2. Delete local clone or keep for reference
### How do I switch between branches?
**Same as normal Git:**
```bash
git checkout main
git checkout -b feature/new-feature
git switch other-branch
```
Everything works the same; Git is inside the container.
### Can I run multiple containers simultaneously?
**Yes!** Clone the repository multiple times with different volume names:
1. Container 1: `mongo-main` (main branch)
2. Container 2: `mongo-feature` (feature branch)
3. Container 3: `mongo-review` (PR review)
Each runs independently with its own cache and environment.
### How do I update the devcontainer?
**To get latest changes:**
```bash
# Pull latest changes
git checkout main
git pull
# Rebuild container
# Command Palette → "Dev Containers: Rebuild Container"
```
This rebuilds the container with any updates to Dockerfile, toolchain, or features.
### Will my data persist after closing the container?
**Yes!** Data in volumes persists:
- ✅ Source code (in workspace volume)
- ✅ Bazel cache (in cache volume)
- ✅ Python venv (in venv volume)
- ✅ Shell history (in history volume)
- ✅ EngFlow credentials (in engflow_auth volume)
**What doesn't persist:**
- ❌ Processes (stopped on container stop)
- ❌ System packages installed with `apt-get` (unless in Dockerfile)
- ❌ Files in `/tmp`
### What happens if I delete the container?
**Volumes are preserved**, so you won't lose:
- Your source code
- Build caches
- Python environment
- Credentials
Just reopen the container and everything is back.
## Development Questions
### How do I build MongoDB?
See [MongoDB Building Guide](../../building.md).
### How do I debug code?
See [Advanced Usage - Debugging Workflow](./advanced.md#debugging-workflow)
### Why is my first build so slow?
First build downloads and compiles everything:
- Third-party dependencies
- MongoDB source
- Generates build files
**First build:** 30-60 minutes
**Incremental builds:** 1-5 minutes
**To speed up:**
- Ensure cache volume is mounted
- Allocate more CPU/RAM to Docker
### How do I format code?
**Automatic (on save):**
- C/C++: clang-format runs automatically
- Python: Ruff runs automatically
- JavaScript: Prettier runs automatically
**Manual:**
```bash
# Format all files
bazel run format
```
### How do I use clangd for IntelliSense?
**It's automatic!** The devcontainer:
1. Builds `compile_commands.json` during setup
2. Configures VS Code to use clangd
3. Disables Microsoft C++ extension
**If not working:**
```bash
# Rebuild compile database
bazel build compiledb --config=local
# Restart clangd
# Command Palette → "clangd: Restart language server"
```
## Troubleshooting
### My build is very slow on macOS
**Check you're using a named volume:**
```bash
# Inside container
df -h /workspaces/mongo
```
If you see a mount from `/Users/...`, you're using a bind mount.
**Solution:** Clone in a named volume (see [Getting Started](./getting-started.md)).
### Python packages are missing
**Activate the virtual environment:**
```bash
source python3-venv/bin/activate
# Should show (python3-venv) in prompt
which python
# Should show: /workspaces/mongo/python3-venv/bin/python
```
**Reinstall packages:**
```bash
poetry install --no-root --sync
```
### VS Code extensions aren't working
**Reload window:**
- Command Palette → "Developer: Reload Window"
**Reinstall extension:**
- Extensions panel → Click extension → Uninstall → Install
**Check it's a container extension:**
- Some extensions only work on host, not in containers
- Look for "Install in Dev Container" button
### Bazel fails with toolchain errors
**Verify toolchain:**
```bash
ls -la /opt/mongodbtoolchain/revisions/
gcc --version # Should show the MongoDB toolchain GCC version
```
**Rebuild container:**
- Command Palette → "Dev Containers: Rebuild Container"
### I can't connect to EngFlow
**Check credentials:**
```bash
ls -la ~/.config/engflow_auth/
```
**Re-authenticate:**
Contact MongoDB team for authentication flow.
**Build locally instead:**
```bash
bazel build --config=local install-mongod
```
### The container won't start
**Check Docker is running:**
```bash
docker info
docker ps
```
**View logs:**
- Command Palette → "Dev Containers: Show Container Log"
- Or: `docker logs <container_id>`
**Rebuild from scratch:**
- Command Palette → "Dev Containers: Rebuild Container Without Cache"
## Performance and Resources
### How much disk space do I need?
Allocate as much disk space as you can comfortably spare. We recommend at least 60GB
### How much RAM should I allocate to Docker?
**Allocate as much as possible** while leaving enough for your host OS to function (~4-8 GB).
More RAM = faster builds with more parallel jobs. MongoDB builds are resource-intensive and benefit greatly from additional memory.
### How many CPU cores should I allocate?
**Allocate as many cores as possible** while leaving a couple for your host OS (1-2 cores).
Bazel parallelizes well; more cores = significantly faster builds. If you have 8+ cores available, MongoDB builds will complete much faster.
### Can I reduce resource usage?
**Yes**, with trade-offs in build speed:
**Reduce Bazel parallelism:**
```bash
bazel build --jobs=N # Replace N with fewer parallel jobs
```
**Limit memory:**
```bash
bazel build --local_ram_resources=HOST_RAM*0.5 # Use only 50% of available RAM
```
**Clear cache periodically:**
```bash
bazel clean # Clear build outputs
bazel clean --expunge # Clear everything (reclaim disk space)
```
> **Note:** Reducing resources will make builds slower. If possible, it's better to allocate more resources to Docker instead.
### How do I monitor resource usage?
```bash
docker stats # Live resource usage
```
**Inside container:**
```bash
htop # If installed
top # Always available
df -h # Disk usage
```
## Advanced Topics
### Can I customize the container?
**Yes!** See [Advanced Usage](./advanced.md) for:
- Using dotfiles in your containers
- Creating custom features
- Modifying VS Code settings
### Can I run the container without VS Code?
**Yes!** Use Docker directly:
```bash
# Build image
docker build -t mongo-dev -f .devcontainer/Dockerfile .
# Run container
docker run -it --rm \
-v mongo-workspace:/workspaces/mongo \
-v mongo-cache:/home/user/.cache \
mongo-dev /bin/bash
# Now you're in the container
cd /workspaces/mongo
bazel build install-mongod
```
But you lose VS Code integration, extensions, and convenience features.
## Getting Help
### Where can I find more information?
- **Getting Started**: [getting-started.md](./getting-started.md)
- **Architecture Details**: [architecture.md](./architecture.md)
- **Troubleshooting**: [troubleshooting.md](./troubleshooting.md)
- **Advanced Topics**: [advanced.md](./advanced.md)
- **VS Code Docs**: [code.visualstudio.com/docs/devcontainers](https://code.visualstudio.com/docs/devcontainers/containers)
### Who do I contact for help?
1. **Documentation**: Check this guide first
2. **Search Issues**: Jira issues
3. **Internal Teams**: #server-local-dev channel in Slack (for employees)
4. **File Bug**: Create Jira issue with details