Docker 沙箱
在一次性、预装常见工具链的容器中运行 Coding Tools MCP。
Docker image 提供一种“工具链已准备好”的沙箱部署形态。它不会猜项目类型,也不会偷偷执行 install / build / test。
本地构建:
docker build -t coding-tools-mcp-sandbox:local .JDK major version 通过 build argument ARG JAVA_VERSION=17 统一定义。需要 Java 21 时:
docker build --build-arg JAVA_VERSION=21 -t coding-tools-mcp-sandbox:local .针对当前仓库运行:
docker run --rm --init -it \
-p 8765:8765 \
-v "$PWD:/workspace" \
coding-tools-mcp-sandbox:local容器 entrypoint 就是 coding-tools-mcp server。镜像内默认配置:
CODING_TOOLS_MCP_WORKSPACE=/workspace
CODING_TOOLS_MCP_HOST=0.0.0.0
CODING_TOOLS_MCP_PORT=8765
CODING_TOOLS_MCP_PERMISSION_MODE=trusted
CODING_TOOLS_MCP_GENERATE_AUTH_TOKEN=1这等价于针对 /workspace 运行:
coding-tools-mcp --host 0.0.0.0 --port 8765 --permission-mode trusted任何配置都可以用 docker run -e 覆盖。
因为容器监听 0.0.0.0,HTTP server 必须有认证。如果既没有设置 CODING_TOOLS_MCP_AUTH_TOKEN,也没有开启 OAuth,server 会在启动时自动生成 bearer token 并打印到 stderr。设置 CODING_TOOLS_MCP_AUTH_MODE=noauth 会关闭自动生成;此时如果仍尝试无凭据地非 loopback bind,server 会直接失败。
镜像还为容器工具链配置文件提供默认 CODING_TOOLS_MCP_EXEC_ALLOW_ROOTS:
/etc/java-17-openjdk:/etc/maven/usr 下的 JVM、Maven 等安装路径本来就是 Landlock 内建 read root,JAVA_HOME 也会自动加入。需要替换默认值时显式设置 CODING_TOOLS_MCP_EXEC_ALLOW_ROOTS。
需要固定 token 时:
docker run --rm -it \
-p 8765:8765 \
-e CODING_TOOLS_MCP_AUTH_TOKEN="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')" \
-v "$PWD:/workspace" \
coding-tools-mcp-sandbox:localDangerous mode 必须显式开启:
docker run --rm -it \
-p 8765:8765 \
-e CODING_TOOLS_MCP_PERMISSION_MODE=dangerous \
-v "$PWD:/workspace" \
coding-tools-mcp-sandbox:localServer 会打印警告:
WARNING: permission_mode=dangerous disables MCP safety gates. Use only inside an isolated container or VM.生命周期与停止
Server 在容器里通常作为 PID 1,因此退出行为非常重要:
docker stop/docker compose stop会发送 SIGTERM。Server 安装了 SIGTERM handler,并会快速以 143(128+15)退出。--rm或docker compose down会在退出后删除容器,避免累积大量 stopped container。--init(compose 中为init: true)使用最小 init 作为 PID 1,负责回收exec_command子进程留下的 zombie。长时间运行的 sandbox 推荐开启。- 容器内 stdio mode:
docker run --rm -i ... --stdio会在 stdin EOF 时退出。MCP host 退出后 pipe 关闭,server 随之停止,--rm自动清理容器。保留-i,不要使用-t,让 stdin 继续是 host 控制的 pipe。
CI 的 smoke check 应通过显式 exec_command 执行,例如:
java -version
javac -version
mvn -version
gcc --version
node --version && npm --version
python --version
go version
cargo --version && rustc --version