Docker¶
所发布的图片展示了可重复使用 MCP 的推荐运行时。
运行¶
artefacts 会被写入容器中的 /data。挂载该路径以保存截图、快照、下载文件和网络输出。
镜像已将 Tini 作为 PID 1 和子进程收割器运行,因此常规命令不需要额外的 Docker init 进程。
有头会话、健康检查和受限运行时¶
使用 headless: false 时,容器会按需启动私有 Xvfb,并一直保留到容器退出。这不是可见桌面,也不提供 VNC、noVNC、RDP、host X11 或屏幕捕获服务。Playwright 的上下文、页面、配置文件和工件相互隔离,但原生 X11 的 focus、clipboard 和屏幕捕获不是租户隔离边界。Docker 健康检查通过私有 Unix socket 检查 MCP CLI event loop;若已启动 Xvfb,还会检查其可用性。它不会通过 MCP stdio 发送流量,也不能替代 /healthz 或 /readyz。对于 read-only root filesystem,请挂载 /data,并在可能使用有头会话时为 /tmp 和 /tmp/.X11-unix 提供 writable tmpfs。
相同的发布标签已发布到 Docker Hub,标签为 swimmwatch/cloakbrowser-mcp,并在 GHCR 上发布为 ghcr.io/swimmwatch/cloakbrowser-mcp。
持久化配置文件¶
Docker 默认不会启用持久化浏览器配置文件。当你希望 cookie、本地存储、缓存或扩展状态在 容器重启后保留时,请使用现有的 /data 卷作为持久化根目录:
docker run --rm -i \
-e PLAYWRIGHT_MCP_USER_DATA_DIR=/data/profiles/default \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest
Docker 内部的环境变量必须使用容器路径,例如 /data/profiles/default, 而不是主机路径。桥接器会在配置文件目录缺失时创建它,验证其可写,将容器路径写入 生成的 Playwright MCP 配置,并拒绝同一服务器进程内重复的活动配置文件目录。
CloakBrowser 许可证缓存¶
该镜像会将 CloakBrowser 二进制文件、许可证状态和验证缓存存储在 /home/node/.cloakbrowser 中。请在此处挂载命名卷,以便在更换容器时保留 GitHub 免费层或 Pro 登录状态:
docker volume create cloakbrowser-cache
docker run --rm -it \
--entrypoint node \
-v cloakbrowser-cache:/home/node/.cloakbrowser \
swimmwatch/cloakbrowser-mcp:latest \
/opt/cloakbrowser-mcp/node_modules/cloakbrowser/dist/cli.js login
docker run --rm -i \
-v cloakbrowser-cache:/home/node/.cloakbrowser \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest
使用同一个卷运行上游 info 或 logout 命令,即可检查或删除已保存的登录状态。 也可以通过容器的机密管理注入 CLOAKBROWSER_LICENSE_KEY。请勿将许可证密钥写入 镜像层、提交到版本控制的 Compose 文件,或作为构建证据捕获的命令输出中。
自定义 CloakBrowser 二进制文件¶
将兼容的浏览器可执行文件挂载到容器中,并通过 --binary-path(或 CLOAKBROWSER_BINARY_PATH)传递其容器内路径:
docker run --rm --init -i \
-v "$PWD/artifacts:/data" \
-v "$PWD/custom-chrome:/browser/chrome:ro" \
swimmwatch/cloakbrowser-mcp:latest \
--binary-path /browser/chrome
该文件必须是与镜像 CPU 架构兼容的可读 Linux 可执行文件,且所需库必须在容器中 可用。该路径适用于容器中的所有 Streamable HTTP 会话;需要不同浏览器二进制文件 时,请运行单独的容器。
Chrome 扩展¶
Chrome 扩展需要持久化配置文件,并且必须单独挂载。请在环境变量中使用容器路径, 而不是主机路径。扩展挂载可以是只读的:
docker run --rm -i \
-e PLAYWRIGHT_MCP_USER_DATA_DIR=/data/profiles/default \
-e CLOAK_PLAYWRIGHT_MCP_EXTENSION_PATHS=/extensions/my-extension \
-v "$PWD/artifacts:/data" \
-v "$PWD/extensions/my-extension:/extensions/my-extension:ro" \
swimmwatch/cloakbrowser-mcp:latest
当路径包含逗号或传入多个扩展目录时,请为 CLOAK_PLAYWRIGHT_MCP_EXTENSION_PATHS 使用 JSON 数组。更改扩展文件或扩展 路径后,请重启容器。
Playwright Extension 连接模式与上面的解压扩展挂载不同。它需要在 persistent Chrome/Edge profile 中安装官方扩展,并提供 PLAYWRIGHT_MCP_EXTENSION_TOKEN。请将每个 profile 挂载到独立的 writable path,通过 secret manager 注入 token,不要同时使用 PLAYWRIGHT_MCP_EXTENSION=true 和 CLOAK_PLAYWRIGHT_MCP_EXTENSION_PATHS。
可流式传输的 HTTP¶
若要在本地使用 Streamable HTTP,请将容器端口发布到回环地址:
docker run --rm -p 127.0.0.1:3000:3000 \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest \
--transport streamable-http --http-host 0.0.0.0 --http-port 3000
curl http://127.0.0.1:3000/healthz
curl http://127.0.0.1:3000/readyz
若要从容器直接访问 HTTPS,请挂载您的证书文件并选择 HTTPS:
docker run --rm -p 127.0.0.1:3000:3000 \
-v "$PWD/artifacts:/data" \
-v "$PWD/certs:/certs:ro" \
swimmwatch/cloakbrowser-mcp:latest \
--transport streamable-http --http-host 0.0.0.0 --http-port 3000 \
--http-protocol https --https-cert /certs/cert.pem --https-key /certs/key.pem
主机端的 127.0.0.1:3000 绑定会将端点保留在本地。 若在非回环接口上发布 Streamable HTTP,请使用 HTTPS 并启用身份验证,或将服务器部署在具有身份验证和网络控制功能的可信 TLS 终止反向代理之后。 Streamable HTTP 公开了固定的 GET /healthz 和 GET /readyz 探测点,它们位于同一主机和端口上。 如果配置了 --http-auth-token 或 CLOAK_PLAYWRIGHT_MCP_HTTP_AUTH_TOKEN 已配置,则这些探针需要与 MCP 请求相同的 Authorization: Bearer ... 标头。 有关所有 HTTP 传输标志和环境变量的详细信息,请参阅生成的 CLI 参考。
已管理 CDP¶
发布已配置的 managed-CDP 范围一对一。此 stdio 示例启用一个 会话并保持每个主机端口绑定到回环地址:
docker run --rm -i \
-p 127.0.0.1:9222-9231:9222-9231 \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest \
--cdp-enabled \
--cdp-port-range 9222-9231 \
--cdp-host 0.0.0.0 \
--cdp-allow-remote \
--cdp-advertised-host 127.0.0.1
--cdp-host 0.0.0.0 是 Docker 端口转发所必需的,因此明确 --cdp-allow-remote 选择加入和具体的 --cdp-advertised-host 也是必需的。 不要将范围重新映射到不同的主机端口号:发现 URL 包含 租用的端口和每个已发布的端口必须一对一地路由到其所属会话。
对于多会话 Streamable HTTP,请配置并发布池,但不要设置 如果客户应单独选择,则处理默认值:
docker run --rm \
-p 127.0.0.1:3000:3000 \
-p 127.0.0.1:9222-9231:9222-9231 \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest \
--transport streamable-http \
--http-host 0.0.0.0 \
--http-port 3000 \
--cdp-port-range 9222-9231 \
--cdp-host 0.0.0.0 \
--cdp-allow-remote \
--cdp-advertised-host 127.0.0.1
一个经过身份验证的 initialize 请求使用 cdpEnabled: true 租约发布了一个 端口。省略的值继承进程默认值,而cdpEnabled: false 明确选择退出且不使用任何 CDP 端口。池耗尽仅拒绝新的 启用 CDP 的会话;它不会降低禁用会话的容量。
从 cloakbrowser_bridge_info 读取具有能力的 URL。不要放入其中 容器日志或健康检查。连接到像 CDP API 这样的 chromium.connectOverCDP();URL 与 Playwright 不兼容 chromium.connect() 或当前的 Open WebUI 流程。
--cdp-advertised-scheme https 将已发布的 URL 更改为 https/wss,但该 桥不为托管的 CDP 提供 TLS。请使用运营商拥有的 TLS 终端。 占用外部网络命名空间中相同的广告端口,保留 Host/Origin,并一对一转发到明文桥接监听器。该 bridge-to-Chromium 跳转也保持明文回环流量。
GeoIP 代理匹配¶
Docker 使用与 npm 相同的代理和 GeoIP 环境变量。当区域 QA 需要 CloakBrowser 的时区、语言和 区域设置指纹以遵循配置的代理位置时,请启用 GeoIP 代理匹配:
docker run --rm -i \
-e PLAYWRIGHT_MCP_PROXY_SERVER="http://user:pass@proxy.example:8080" \
-e CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH=true \
-v "$PWD/artifacts:/data" \
swimmwatch/cloakbrowser-mcp:latest
对于需要身份验证的代理,请将凭据嵌入代理 URL 中,并对用户名或密码中的特殊字符进行百分比编码。
受支持的 CloakBrowser 二进制文件使用原生 URL 内联代理身份验证;较旧的二进制 文件会回退到 Playwright 代理对象。
当容器运行 Streamable HTTP 时,客户端还可以通过 initialize 元数据,为每个 MCP 会话选择不同的 代理。请参阅 GeoIP 代理匹配,了解运行时代理元数据、 多区域用例及限制。
默认值¶
| Variable | Default |
|---|---|
PLAYWRIGHT_MCP_BROWSER_ENGINE | cloak |
PLAYWRIGHT_MCP_HEADLESS | true |
PLAYWRIGHT_MCP_OUTPUT_DIR | /data |
PLAYWRIGHT_MCP_USER_DATA_DIR | unset |
CLOAK_PLAYWRIGHT_MCP_TRANSPORT | stdio |
CLOAK_PLAYWRIGHT_MCP_HTTP_PROTOCOL | http |
CLOAK_PLAYWRIGHT_MCP_HTTP_HOST | 127.0.0.1 |
CLOAK_PLAYWRIGHT_MCP_HTTP_PORT | 3000 |
CLOAK_PLAYWRIGHT_MCP_HTTP_ENDPOINT | /mcp |
CLOAK_PLAYWRIGHT_MCP_HTTP_AUTH_TOKEN | unset |
CLOAK_PLAYWRIGHT_MCP_HTTP_SESSION_BACKEND | memory |
CLOAK_PLAYWRIGHT_MCP_HTTP_SESSION_IDLE_TTL_MS | 3600000 |
CLOAK_PLAYWRIGHT_MCP_HTTP_SESSION_MAX | 32 |
CLOAK_PLAYWRIGHT_MCP_LOG_LEVEL | info |
CLOAK_PLAYWRIGHT_MCP_GEOIP_PROXY_MATCH | false |
CLOAK_PLAYWRIGHT_MCP_CONTEXT_OPTIONS | unset |
CLOAK_PLAYWRIGHT_MCP_EXTENSION_PATHS | unset |
CLOAK_PLAYWRIGHT_MCP_CONSOLE_FALLBACK | true |
CLOAK_PLAYWRIGHT_MCP_STEALTH_ARGS | true |
CLOAK_PLAYWRIGHT_MCP_NO_SANDBOX | true |
MCP 客户端配置¶
{
"mcpServers": {
"cloakbrowser": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-v",
"/tmp/cloakbrowser-artifacts:/data",
"swimmwatch/cloakbrowser-mcp:latest"
]
}
}
}
本地构建¶
该 Dockerfile 使用已锁定的官方 Playwright MCP 镜像作为运行时基础镜像,在构建过程中应用可用的 Debian 安全更新,从运行时镜像中移除未使用的全局 npm 有效载荷,并在 /opt/cloakbrowser-mcp下安装桥接服务。
该发布工作流会发布 SBOM 和溯源证明,包含源代码、修订版、版本、许可证、基础镜像名称以及基础镜像摘要的 OCI 标签,并在发布前使用 Trivy 对构建好的镜像进行扫描。
更多实用路径¶
要在 upstream Playwright MCP 和本包之间选择,请查看对比。快速任务请使用操作示例:持久配置文件、扩展、reverse proxy、区域 QA、Claude Desktop、Codex CLI 和 CI 冒烟测试。