尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Playwright Docker 官方镜像实战指南:拉取、运行、seccomp 安全隔离与远程 Server 连接

Playwright Docker 官方镜像实战指南:拉取、运行、seccomp 安全隔离与远程 Server 连接 Playwright Docker 官方镜像实战指南拉取、运行、seccomp 安全隔离与远程 Server 连接【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwrightPlaywright 官方提供了内嵌浏览器与系统依赖的 Docker 镜像让你无需在每台机器上手工安装浏览器即可运行端到端测试、爬虫抓取或远程浏览器服务。本文基于仓库内的 Docker 官方文档 展开结合 utils/docker/Dockerfile.noble、utils/docker/seccomp_profile.json 等构建源码完整覆盖镜像拉取、以 root 或非 root 用户运行、seccomp 沙箱配置、CI 集成、run-server远程连接与 noVNC 可视调试等场景并解释镜像内部的目录结构与版本锁定机制。官方镜像的内容与定位官方文档 docs/src/docker.md 明确了镜像的边界镜像已包含Playwright 浏览器二进制Chromium、Firefox、WebKit以及浏览器运行所需的系统依赖镜像不包含Playwright 包本身npm/pip/nuget/Maven 依赖需要在容器内自行安装对应语言的 Playwright 包。这一设计与 Dockerfile.noble 的构建过程一致镜像先把浏览器“烘焙”进/ms-playwright目录通过ENV PLAYWRIGHT_BROWSERS_PATH/ms-playwright而 Playwright 包本身留给你在使用时安装。拉取镜像镜像发布在 Microsoft Artifact RegistryMCR。以下四个命令分别对应 JavaScript、Python、.NET、Java 语言栈docker pull mcr.microsoft.com/playwright:vVERSION-noble# Python docker pull mcr.microsoft.com/playwright/python:vVERSION-noble # .NET docker pull mcr.microsoft.com/playwright/dotnet:vVERSION-noble # Java docker pull mcr.microsoft.com/playwright/java:vVERSION-noble说明原始文档中使用%%VERSION%%占位符文档构建时会替换为当前发布版本号。当前仓库package.json中的版本为 1.64.0-next开发线实际使用时请以 MCR 上最新稳定 tag 为准文档 noVNC 一节给出的具体示例即mcr.microsoft.com/playwright:v1.57.0。务必固定版本 tag。文档特别警告如果镜像中的 Playwright 版本与你项目/测试中的版本不一致Playwright 将无法定位到浏览器可执行文件。固定版本可以消除这种漂移。镜像标签体系当前发布的 tag 规则见 docs/src/docker.md “Image tags” 一节Tag含义:vVERSION基于 Ubuntu 24.04 LTSNoble Numbat的发布镜像:vVERSION-noble基于 Ubuntu 24.04 LTSNoble Numbat:vVERSION-jammy基于 Ubuntu 22.04 LTSJammy Jellyfish:vVERSION-resolute基于 Ubuntu 26.04 LTSResolute Raccoon从发布脚本 utils/docker/publish_docker.sh 的源码结构可以进一步确认两点裸 tag不带发行版后缀只打在stable频道且仅附加在 noble 构建上NOBLE_TAGS(${VERSION_TAG})只在 stable 分支执行见 publish_docker.shcanary频道的 tag 形如v版本-canary-UTC时间戳且每个 tag 都会生成amd64/arm64两种架构镜像再用docker manifest合成多架构 manifest见 publish_docker.sh 与 publish_docker.sh。基础镜像与 Alpine 限制官方只基于 glibc 家族的 Ubuntu 发行版构建Ubuntu 26.04 LTSresolute、Ubuntu 24.04 LTSnoble、Ubuntu 22.04 LTSjammy。Firefox 与 WebKit 的浏览器二进制是为 glibc 编译的因此Alpine Linux 等基于 musl 的发行版不受支持——如果你要自建镜像请以 Ubuntu/Debian 系为基础而不是 Alpine。镜像内部结构源码级解读阅读 utils/docker/Dockerfile.noble 可以看到官方镜像的几个关键设计预创建非 root 用户pwuser构建阶段通过adduser pwuser创建Dockerfile.noble。这正是后文“抓取/爬虫场景用--user pwuser运行”能直接生效的原因。浏览器分图层安装以支持并行拉取Chromium、Firefox、WebKit 各自独立RUN层安装Dockerfile.noble。其中安装 Chromium 会同时带入chromium-headless-shell和ffmpeg后者用于视频录制。写入镜像名标记构建时执行playwright-core mark-docker-image ${DOCKER_IMAGE_NAME_TEMPLATE}Dockerfile.noble。该隐藏 CLI 命令定义在 packages/playwright-core/src/cli/program.ts实现位于 packages/playwright-core/src/cli/installActions.ts——它把镜像名模板写入容器内使 Playwright 在版本匹配时能直接定位/ms-playwright下已安装的浏览器。这也从源码层面解释了为什么“镜像版本必须与项目版本一致”是硬性要求。Node.js 预装JS 镜像内置 Node.js 24Dockerfile.noble所以远程连接示例可以直接用npx -y playwright版本 run-server启动服务。运行镜像root 与 seccomp 两种模式文档给出一条重要安全提示该镜像仅用于测试与开发目的不建议用它访问不可信的网站。同时默认以root用户运行浏览器会禁用 Chromium 沙箱沙箱在 root 下不可用。因此文档按场景给出两套运行方式场景一可信网站的端到端测试root 模式如果你的代码运行在可信站点上例如自己的 E2E 测试用 root 运行即可省去管理独立用户的麻烦docker run -it --rm --ipchost mcr.microsoft.com/playwright:vVERSION-noble /bin/bashPython / .NET / Java 镜像同理只需替换镜像名playwright/python、playwright/dotnet、playwright/java。场景二抓取与爬虫非 root seccomp访问不可信站点时文档推荐用独立用户pwuser启动浏览器并叠加 seccomp profile以启用 Chromium 沙箱docker run -it --rm --ipchost --user pwuser \ --security-opt seccompseccomp_profile.json \ mcr.microsoft.com/playwright:vVERSION-noble /bin/bash其中seccomp_profile.json就是仓库中的 utils/docker/seccomp_profile.json。它本质是 Docker 默认 seccomp profile 加上一条“允许创建用户命名空间”的例外规则seccomp_profile.json{ comment: Allow create user namespaces, names: [ clone, setns, unshare ], action: SCMP_ACT_ALLOW, args: [], includes: {}, excludes: {} }Chromium 的用户命名空间沙箱依赖clone/setns/unshare这些系统调用默认的 Docker seccomp 策略会拦截它们所以必须用这份放宽了这三个调用的 profile。使用--security-opt seccompseccomp_profile.json时需把该文件挂载或映射到容器可访问的路径例如当前目录或~/.docker。推荐的 Docker 运行配置文档列出了三条运行建议均针对 Chromium 在容器内的常见故障加--init标志避免对 PID1 进程的特殊处理这是容器内产生僵尸进程的常见原因Chromium 场景加--ipchost不加的话 Chromium 可能因共享内存不足而崩溃Docker 默认的/dev/shm较小本地开发遇到 Chromium 启动的怪异错误时尝试docker run --cap-addSYS_ADMIN增加权限定位问题。CI 集成文档将 CI 场景指向 docs/src/ci.md 中的 Continuous Integration 指南那里给出了各 CI 平台GitHub Actions 等配合官方镜像的完整示例配置。核心思路与本文一致在 CI runner 上直接docker run官方镜像执行测试省去“在 runner 上装浏览器 装依赖”的步骤。远程连接容器内跑 Playwright Server宿主机跑测试这是 Docker 镜像最有价值的进阶用法在容器内启动Playwright Server测试留在宿主机或另一台机器上运行。适用于在不受支持的 Linux 发行版上跑测试或任何远程执行场景。第一步在容器中启动 Serverdocker run -p 3000:3000 --rm --init -it \ --workdir /home/pwuser --user pwuser \ mcr.microsoft.com/playwright:vVERSION-noble \ /bin/sh -c npx -y playwrightVERSION run-server --port 3000 --host 0.0.0.0注意命令中镜像版本与playwrightVERSION的包版本要保持一致。第二步连接 ServerJavaScript 有两种连接方式# 方式 1playwright/test 通过环境变量连接 PW_TEST_CONNECT_WS_ENDPOINTws://127.0.0.1:3000/ npx playwright test// 方式 2BrowserType.connect API适用于其他应用 const browser await playwright[chromium].connect(ws://127.0.0.1:3000/);环境变量机制的源码依据playwright/test的入口 packages/playwright/src/index.ts 中读取process.env.PW_TEST_CONNECT_WS_ENDPOINT并将测试重定向到远程服务器。其余语言通过connect方法连接from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.connect(ws://127.0.0.1:3000/)using Microsoft.Playwright; using var playwright await Playwright.CreateAsync(); await using var browser await playwright.Chromium.ConnectAsync(ws://127.0.0.1:3000/);package org.example; import com.microsoft.playwright.*; public class App { public static void main(String[] args) { try (Playwright playwright Playwright.create()) { Browser browser playwright.chromium().connect(ws://127.0.0.1:3000/); } } }容器访问宿主机本地服务器如果测试要访问运行在宿主机上的被测服务如本地起的 Web Server容器内的localhost指向容器自身而非宿主机。解决方法是加--add-hosthostmachine:host-gatewaydocker run --add-hosthostmachine:host-gateway -p 3000:3000 --rm --init -it \ --workdir /home/pwuser --user pwuser \ mcr.microsoft.com/playwright:vVERSION-noble \ /bin/sh -c npx -y playwrightVERSION run-server --port 3000 --host 0.0.0.0之后测试代码中把目标地址从localhost改为hostmachine。文档最后再次提醒远端执行时测试端与容器内的 Playwright 版本必须一致。用 noVNC 可视调试Docker / GitHub Codespaces官方镜像内置 noVNC 查看器可以让你在容器里“看见”浏览器用于录制测试、拾取选择器和运行 codegen。在.devcontainer/devcontainer.json中启用desktop-litefeature 并指定 web 端口即可{ image: mcr.microsoft.com/playwright:v1.57.0, forwardPorts: [6080], features: { desktop-lite: { webPort: 6080 } } }配置后在浏览器新标签页打开 6080 端口即可访问 noVNC web viewer直接在容器内完成测试录制与选择器拾取。其他实用技巧.NET 用户使用其他版本 SDK镜像内预装了某一版 .NET SDK如需其他版本可在容器内用官方 dotnet-install 脚本安装curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --install-dir /usr/share/dotnet --channel 9.0自建镜像如果不想依赖官方镜像只需在基础镜像里装好“语言运行时 浏览器 系统依赖”。文档给出的最小 DockerfileJavaScriptNodeFROM node:20-bookworm RUN npx -y playwrightVERSION install --with-depsPythonFROM python:3.12-bookworm RUN pip install playwrightVERSION \ playwright install --with-depsinstall --with-deps会同时安装浏览器与系统依赖。与官方镜像不同自建镜像的浏览器默认装在当前用户的~/.cache/ms-playwright而非/ms-playwright因此不需要mark-docker-image这类标记机制。小结场景关键配置可信站点 E2Edocker run -it --rm --ipchost ...root 即可抓取/爬虫不可信站点--user pwuser --security-opt seccompseccomp_profile.json防止僵尸进程 / Chromium 崩溃--init--ipchost必要时--cap-addSYS_ADMIN远程执行容器内run-server --port 3000外部connect(ws://127.0.0.1:3000/)或PW_TEST_CONNECT_WS_ENDPOINT容器访问宿主服务--add-hosthostmachine:host-gateway代码中改用hostmachine可视调试devcontainerdesktop-litefeature 转发 6080 端口贯穿所有场景的三条纪律固定镜像版本 tag、镜像版本与项目版本一致、浏览器相关镜像只基于 glibc 发行版。仓库中 utils/docker/ 目录下的 Dockerfile.noble、Dockerfile.jammy、Dockerfile.resolute、seccomp_profile.json 与 publish_docker.sh 是理解与验证上述机制的第一手材料。【免费下载链接】playwrightPlaywright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.项目地址: https://gitcode.com/GitHub_Trending/pl/playwright创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表