How Docker Installation Provides Filesystem Isolation and Mount Options in Desktop Commander
Docker installation in Desktop Commander creates a sandboxed container environment that completely isolates the application runtime from the host OS while using named volumes and selective bind mounts to maintain persistent state and controlled host filesystem access.
Desktop Commander's Docker-based deployment is implemented in the wonderwhy-er/DesktopCommanderMCP repository. This approach ensures that all Node.js dependencies, system binaries, and package installations remain contained within the Docker environment, preventing any modification to the host's root filesystem. The isolation strategy relies on a minimal Alpine-based image and a sophisticated volume management system defined across two core files: Dockerfile and install-docker.sh.
Filesystem Isolation Through Container Architecture
The foundation of Desktop Commander's isolation is a purpose-built Docker image that runs the entire application stack inside a private namespace.
Dockerfile: Building the Isolated Runtime
In Dockerfile (lines 1–27), the build process establishes a clean separation from the host:
# https://github.com/wonderwhy-er/DesktopCommanderMCP/blob/main/Dockerfile
FROM node:lts-alpine
ENV MCP_CLIENT_DOCKER=true
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --ignore-scripts
RUN npm rebuild @vscode/ripgrep
COPY . .
RUN npm run build
CMD ["node", "dist/index.js"]
Key isolation mechanisms:
FROM node:lts-alpine— Uses a minimal 5 MB Alpine Linux base with Node.js pre-installed, eliminating any dependency on host OS librariesWORKDIR /usr/src/app— Establishes a private working directory invisible to the host filesystemENV MCP_CLIENT_DOCKER=true— Signals to the application that it's running in containerized mode, enabling Docker-specific behaviors- Layered
COPYandRUNcommands — All build operations occur inside container layers; the host only stores the final image
Transient Container Execution
The install-docker.sh script (line 48) appends --rm to every docker run invocation:
DOCKER_ARGS=("run" "-i" "--rm")
This flag ensures that each command executes in a fresh container instance that is automatically destroyed on exit. Any file system changes not persisted to named volumes are discarded, providing process-level isolation.
Persistent Storage Through Named Volumes
To maintain state across container restarts without breaking isolation, Desktop Commander uses four named Docker volumes defined in the ESSENTIAL_VOLUMES array.
Volume Creation in setup_persistent_volumes()
In install-docker.sh (lines 19–24), the setup_persistent_volumes() function creates dedicated storage namespaces:
# https://github.com/wonderwhy-er/DesktopCommanderMCP/blob/main/install-docker.sh#L19-L24
ESSENTIAL_VOLUMES=(
"dc-system:/usr"
"dc-home:/root"
"dc-workspace:/workspace"
"dc-packages:/var"
)
for volume in "${ESSENTIAL_VOLUMES[@]}"; do
volume_name=$(echo "$volume" | cut -d':' -f1)
docker volume create "$volume_name" >/dev/null
done
| Volume Name | Container Mount | Purpose |
|---|---|---|
dc-system |
/usr |
System packages and installed binaries |
dc-home |
/root |
User configuration, SSH keys, Git settings |
dc-workspace |
/workspace |
Development projects and working files |
dc-packages |
/var |
Package caches, logs, and temporary data |
These volumes are Docker-managed storage that persists on the host's Docker data directory—not in the host's root filesystem or user home. This design prevents "dependency pollution" where tools installed inside the container would otherwise leak into the host environment.
Controlled Host Access Through Bind Mounts
Desktop Commander selectively exposes host directories through bind mounts that translate user-selected folders into the container's /home namespace.
build_docker_args(): Mount Path Normalization
In install-docker.sh (lines 48–64), the build_docker_args() function handles path translation:
# https://github.com/wonderwhy-er/DesktopCommanderMCP/blob/main/install-docker.sh#L48-L64
DOCKER_ARGS=("run" "-i" "--rm")
# attach essential volumes
for volume in "${ESSENTIAL_VOLUMES[@]}"; do
DOCKER_ARGS+=("-v" "$volume")
done
# attach user-chosen folders
for folder in "${FOLDERS[@]}"; do
if [[ "$folder" =~ ^/Users/[^/]+(/.+)$ ]]; then
absolute_path="${BASH_REMATCH[1]}"
DOCKER_ARGS+=("-v" "$folder:/home$absolute_path")
elif [[ "$folder" =~ ^/home/[^/]+(/.+)$ ]]; then
absolute_path="${BASH_REMATCH[1]}"
DOCKER_ARGS+=("-v" "$folder:/home$absolute_path")
else
folder_name=$(basename "$folder")
DOCKER_ARGS+=("-v" "$folder:/home/$folder_name")
fi
done
DOCKER_ARGS+=("$DOCKER_IMAGE")
Mount path translation logic:
- macOS paths (
/Users/<username>/...) — Strips the/Users/<username>prefix and remaps to/home/<remainder> - Linux paths (
/home/<username>/...) — Strips the/home/<username>prefix and remaps to/home/<remainder> - Other paths — Uses
basenameto create/home/<folder_name>
This normalization ensures a consistent /home structure inside the container regardless of the host OS, while the bash regex patterns explicitly constrain which host paths can be exposed.
Complete Isolation vs. Access Trade-offs
Desktop Commander's Docker installation implements a defense-in-depth strategy for filesystem security:
- Complete isolation — Runtime, dependencies, and system modifications occur only in the
node:lts-alpineimage and named volumes - Explicit access — Host filesystem exposure requires affirmative user selection during
install-docker.shexecution - Path sandboxing — All bind mounts are routed through
/home, preventing accidental exposure of sensitive host paths like/etc,/usr, or/var
The MCP_CLIENT_DOCKER=true environment variable enables the application to recognize its containerized context and adjust behavior accordingly—for example, by avoiding operations that would require host-level privileges.
Summary
- Isolation core —
Dockerfilebuilds a minimalnode:lts-alpineimage with a private/usr/src/appworking directory - Named volumes —
dc-system,dc-home,dc-workspace, anddc-packagesprovide persistent, Docker-managed storage for configuration and packages - Bind mount controls —
build_docker_args()ininstall-docker.shnormalizes user-selected folders into/homewith regex-constrained path translation - Transient execution —
--rmflag ensures fresh containers per command, discarding uncommitted changes - Zero host pollution — All package installations and system modifications remain in named volumes, never touching the host root filesystem
Frequently Asked Questions
What happens to data stored outside the four named volumes?
Data written outside /usr, /root, /workspace, /var, or bind-mounted /home paths is lost when the container exits. The --rm flag destroys the container instance, and only named volumes and bind mounts persist. Applications should be configured to write to /workspace or bind-mounted directories for durable storage.
Can I add additional host folders after initial installation?
Yes. Re-run install-docker.sh and specify new folders when prompted. The script regenerates the Docker run configuration in Claude's MCP settings, and the new bind mounts take effect on the next Desktop Commander invocation. Existing named volumes retain their data.
Why does Desktop Commander use /home instead of the host's home path inside the container?
The /home normalization provides cross-platform consistency. macOS users with /Users/alice/projects and Linux users with /home/alice/projects both see their files at /home/projects inside the container. This simplifies documentation, debugging, and MCP configuration portability between operating systems.
Is the Docker installation more secure than the standard install.sh method?
According to the Desktop Commander source code, Docker installation provides stronger filesystem isolation. The standard install.sh runs natively with full host filesystem access and can modify system packages directly. The Docker approach constrains all runtime activity to the container namespace with explicit, user-controlled host directory exposure.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →