docker-selenium 4.48.0 的 Edge 133 镜像打标签全流程解析:从 tag_and_push_browser_images.sh 到 node-edge 镜像标签规范
docker-selenium 4.48.0 的 Edge 133 镜像打标签全流程解析:从 tag_and_push_browser_images.sh 到 node-edge 镜像标签规范
本篇文章围绕 docker-selenium 仓库 4.48.0 版本的 Edge 133 发布记录(CHANGELOG/4.48.0/edge_133.md)展开,深入解析 Edge 133.0.3065.92 镜像的标签生成机制、脚本参数含义以及 node-edge / standalone-edge 镜像的标签规范。读完本文,你将掌握 docker-selenium 浏览器镜像标签的完整命名体系、打标签脚本的执行逻辑,以及如何在生产环境准确选择和使用 Edge 133 相关镜像标签。
一、发布记录解读:一次 Edge 133 镜像打标签的完整输出
在 CHANGELOG/4.48.0/edge_133.md 中,保存了 Selenium Grid 4.48.0 发布时对 Edge 133 镜像执行打标签命令的完整日志。原始日志内容如下:
./tag_and_push_browser_images.sh 4.48.0 20260909 selenium false edge true
Tagging images for browser edge, version 4.48.0, build date 20260909, namespace selenium
Selenium Grid version -> 4.48.0-20260909
Edge version -> 133.0.3065.92
Short Edge version -> 133.0
EdgeDriver version -> 133.0.3065.92
Short EdgeDriver version -> 133.0
Tagged selenium/node-edge:133.0.3065.92-edgedriver-133.0.3065.92-grid-4.48.0-20260909
Tagged selenium/standalone-edge:133.0.3065.92-edgedriver-133.0.3065.92-grid-4.48.0-20260909
Tagged selenium/node-edge:133.0.3065.92-edgedriver-133.0.3065.92-20260909
Tagged selenium/standalone-edge:133.0.3065.92-edgedriver-133.0.3065.92-20260909
Tagged selenium/node-edge:133.0.3065.92-20260909
Tagged selenium/standalone-edge:133.0.3065.92-20260909
Tagged selenium/node-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909
Tagged selenium/standalone-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909
Tagged selenium/node-edge:133.0-edgedriver-133.0-20260909
Tagged selenium/standalone-edge:133.0-20260909
Tagged selenium/node-edge:133.0-20260909
Tagged selenium/standalone-edge:133.0-20260909
这条日志包含了本次发布的核心事实:
- Selenium Grid 版本:4.48.0-20260909(即 4.48.0,构建日期 20260909);
- Edge 浏览器版本:133.0.3065.92,短版本号 133.0;
- EdgeDriver 版本:133.0.3065.92,短版本号 133.0;
- 打标签对象:
node-edge与standalone-edge两个镜像,各获得 6 个标签。
日志中命令的最后一个参数为 true,对应脚本的 RELEASE_OLD_VERSION 参数,它决定了本次仅生成 6 个标签(而非完整 10 个)。下文将详细拆解这一机制。
二、脚本参数逐项解析:一条命令控制全部标签
日志中的命令指向仓库根目录下的 tag_and_push_browser_images.sh。该脚本通过位置参数接收 7 个输入(脚本第 1-9 行):
| 参数位置 | 变量名 | 本次取值 | 含义 |
|---|---|---|---|
| 1 | VERSION | 4.48.0 | Selenium Grid 版本号 |
| 2 | BUILD_DATE | 20260909 | 构建日期(YYYYMMDD) |
| 3 | NAMESPACE | selenium | 镜像命名空间 |
| 4 | PUSH_IMAGE | false | 是否在打标签后执行 docker push |
| 5 | BROWSER | edge | 浏览器类型(chrome/chromium/edge/firefox/chrome-for-testing) |
| 6 | RELEASE_OLD_VERSION | true | 是否为旧版本补发标签(true 时跳过不带日期的最简标签) |
| 7 | PLATFORM | (未传,默认 linux/amd64) | 运行镜像探测版本时指定的平台 |
脚本第 15-16 行将版本与日期拼接为 TAG_VERSION=${VERSION}-${BUILD_DATE},即 4.48.0-20260909,这也是本次发布的 Grid 基础镜像标签。
2.1 版本号探测:用容器内命令反查真实版本
脚本并不假设 Edge 的具体版本,而是直接运行已构建好的 node-edge:4.48.0-20260909 容器,从容器内执行命令解析出版本号。对应 脚本第 152-161 行:
EDGE_VERSION=$(docker run --rm ${NAMESPACE}/node-edge:${TAG_VERSION} microsoft-edge --version | awk '{print $3}')
EDGE_SHORT_VERSION="$(short_version ${EDGE_VERSION})"
EDGEDRIVER_VERSION=$(docker run --rm ${NAMESPACE}/node-edge:${TAG_VERSION} msedgedriver --version | awk '{print $4}')
EDGEDRIVER_SHORT_VERSION="$(short_version ${EDGEDRIVER_VERSION})"
注意 Edge 与 Chrome 的解析位置不同:Edge 浏览器版本取 microsoft-edge --version 输出的第 3 个字段(133.0.3065.92),而 EdgeDriver 版本取 msedgedriver --version 输出的第 4 个字段。short_version 函数(脚本第 53-57 行)将长版本号按 . 拆分后仅保留前两段,得到 133.0,用于生成短版本标签。
这解释了日志中 "Edge version -> 133.0.3065.92" 与 "Short Edge version -> 133.0" 两行输出的来源:版本号不是硬编码的,而是每次发布时从镜像内部实测获得,确保标签与实际镜像内容严格一致。
三、标签体系全解:本次生成的 6 个标签及其含义
脚本将标签分为三类,本次日志生成了 6 个标签(node-edge 与 standalone-edge 各 6 个,共 12 行输出):
第一类:完整版本 + Grid 版本 + 构建日期
selenium/node-edge:133.0.3065.92-edgedriver-133.0.3065.92-grid-4.48.0-20260909
第二类:完整版本 + 构建日期
selenium/node-edge:133.0.3065.92-edgedriver-133.0.3065.92-20260909
selenium/node-edge:133.0.3065.92-20260909
第三类:短版本(133.0)系列
selenium/node-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909
selenium/node-edge:133.0-edgedriver-133.0-20260909
selenium/node-edge:133.0-20260909
这三类标签对应脚本中 EDGE_TAGS 数组的定义(第 163-175 行):
EDGE_TAGS=(
${EDGE_VERSION}-edgedriver-${EDGEDRIVER_VERSION}-grid-${TAG_VERSION}
${EDGE_VERSION}-edgedriver-${EDGEDRIVER_VERSION}-${BUILD_DATE}
${EDGE_VERSION}-${BUILD_DATE}
${EDGE_SHORT_VERSION}-edgedriver-${EDGEDRIVER_SHORT_VERSION}-grid-${TAG_VERSION}
${EDGE_SHORT_VERSION}-edgedriver-${EDGEDRIVER_SHORT_VERSION}-${BUILD_DATE}
${EDGE_SHORT_VERSION}-${BUILD_DATE}
)
3.1 为什么本次只生成了 6 个标签而不是 10 个
日志中命令第 6 个参数为 true,即 RELEASE_OLD_VERSION=true。脚本 第 176-187 行 的逻辑是:仅当 RELEASE_OLD_VERSION=false(即当前发布的是新版本)时,才追加 4 个不带构建日期的最简标签:
if [ "${RELEASE_OLD_VERSION}" = "false" ]; then
EDGE_TAGS+=(
${EDGE_VERSION}-edgedriver-${EDGEDRIVER_VERSION}
${EDGE_VERSION}
${EDGE_SHORT_VERSION}-edgedriver-${EDGEDRIVER_SHORT_VERSION}
${EDGE_SHORT_VERSION}
)
fi
也就是说,若发布的是全新 Edge 版本,每个镜像会得到完整的 10 个标签,额外包括:
selenium/node-edge:133.0.3065.92-edgedriver-133.0.3065.92
selenium/node-edge:133.0.3065.92
selenium/node-edge:133.0-edgedriver-133.0
selenium/node-edge:133.0
本次发布场景属于"为已有镜像补充日期版本标签"(旧版本场景),因此只保留了含构建日期的 6 个标签,避免用旧版本覆盖 :133.0 这类滚动标签。
3.2 标签的两种对象:node-edge 与 standalone-edge
脚本对 EDGE_TAGS 中的每个标签,都同时应用于两个镜像(脚本第 189-192 行):
for edge_tag in "${EDGE_TAGS[@]}"; do
retag node-edge "${edge_tag}"
retag standalone-edge "${edge_tag}"
done
node-edge:Selenium Grid 的 Edge 节点镜像,需要配合 Hub(或 Router 等 Grid 组件)使用;standalone-edge:独立的 Edge Standalone 镜像,内含完整的 Grid 服务,可单独启动运行 WebDriver 测试。
这一点在日志中同样体现:每一行 "Tagged" 都是 node 与 standalone 成对出现的。
四、源码视角:Edge 133 镜像内部的浏览器与驱动
4.1 NodeEdge Dockerfile 的安装逻辑
NodeEdge/Dockerfile 定义了 node-edge 镜像的构建过程,其中与本次发布的 Edge 133.0.3065.92 直接相关的关键步骤包括:
Edge 浏览器安装(第 16-34 行):默认安装 microsoft-edge-stable 渠道;当通过 EDGE_VERSION 指定精确版本(如 microsoft-edge-stable=133.0.3065.92-1)时,会从 per-version 归档站点下载对应架构的 .deb 包安装。Microsoft 会清理 packages.microsoft.com 上的旧版本,因此版本精确安装走归档路径。
EdgeDriver 安装(第 51-68 行):默认通过 msedgedriver.microsoft.com/LATEST_RELEASE_<主版本号>_LINUX 接口获取与 Edge 主版本匹配的最新驱动;当该版本已被清理时,回退使用浏览器自身的精确版本号,并从归档站点下载。驱动被安装到 /opt/selenium/msedgedriver-<版本> 并软链接到 /usr/bin/msedgedriver。
浏览器信息注册(第 82-85 行):将浏览器名称、版本和二进制路径写入 /opt/selenium/browsers/edge/,供 Grid 节点向 Hub 上报能力时使用:
MicrosoftEdge / 133.0.3065.92 / /usr/bin/microsoft-edge
Edge 启动包装器(第 39-40 行):镜像通过 wrap_edge_binary 将 microsoft-edge 替换为包装脚本。包装脚本为 Edge 进程设置 umask 002、处理 --lang 语言参数(映射为 LANGUAGE 环境变量)、收集以 SE_BROWSER_ARGS_ 开头的环境变量作为浏览器启动参数,最终以 --no-sandbox 方式启动真实二进制——这是容器内以 root 之外用户运行浏览器所必需的。
4.2 版本探测命令的对应关系
脚本在打标签前用 docker run 探测版本,探测命令正是读取了 NodeEdge/Dockerfile 第 84 行 安装好的二进制:
microsoft-edge --version→ 输出形如Microsoft Edge 133.0.3065.92,取第 3 个字段得133.0.3065.92;msedgedriver --version→ 输出形如Microsoft Edge WebDriver 133.0.3065.92 ...,取第 4 个字段得133.0.3065.92。
本次发布中 Edge 与 EdgeDriver 版本完全一致(都是 133.0.3065.92),这也是 Edge 稳定版驱动的标准形态:驱动版本跟随浏览器主版本,且通常与浏览器完整版本号一致。
五、retag 函数与多架构镜像:标签如何真正落地
5.1 本地打标签与推送
retag 函数(脚本第 31-51 行) 是标签落地的核心:
docker tag "${NAMESPACE}/${__image}:${TAG_VERSION}" "${NAMESPACE}/${__image}:${__tag}"
if [ "${PUSH_IMAGE}" = true ]; then
docker push "${NAMESPACE}/${__image}:${__tag}"
fi
本次日志中 PUSH_IMAGE=false,因此只执行了 docker tag(本地复制标签)而未执行 docker push。日志中的 "Tagged" 提示正是脚本在 第 47 行 打印的。
5.2 PROMOTE_TAGS:发布晋升机制中的特殊路径
脚本还支持 PROMOTE_TAGS 环境变量(第 12 行),由发布流水线 deploy.yml 设置。当 PROMOTE_TAGS=true 时,发布不再重新构建镜像,而是直接把 CI 中已测试通过的镜像清单(manifest)从 registry 到 registry 复制并追加标签(第 36-43 行):
docker buildx imagetools create --tag "${NAMESPACE}/${__image}:${__tag}" "${__source}"
脚本注释解释了原因:docker tag 只能操作本地镜像,而晋升场景下本地没有镜像,且 docker pull 只能拉取当前架构,会破坏多架构标签;buildx imagetools 直接操作镜像索引,可保留多架构特性。同时可通过 PROMOTE_GHCR_NAMESPACE 在同一调用中完成 Docker Hub 与 GHCR 的双重镜像。
六、Makefile 中的对应入口
Makefile 将打标签脚本包装为 make target。与本次日志对应的入口在 第 781-796 行:
tag_and_push_browser_images: tag_and_push_chrome_images tag_and_push_chrome-for-testing_images tag_and_push_chromium_images tag_and_push_firefox_images tag_and_push_edge_images
tag_and_push_edge_images:
./tag_and_push_browser_images.sh $(VERSION) $(BUILD_DATE) $(NAMESPACE) $(PUSH_IMAGE) edge $(RELEASE_OLD_VERSION)
Makefile 顶部(第 1-16 行)定义了这些变量的默认值:VERSION=4.49.0、BUILD_DATE 默认为当前日期、PUSH_IMAGE=false、RELEASE_OLD_VERSION=false。也就是说,本地执行 make tag_and_push_edge_images 会为新版本生成完整 10 个标签。
另外,edge_upgrade_version target(第 772-777 行) 展示了 Edge 镜像版本升级的标准流程:先用 docker buildx build 构建 node-edge,再基于 node-edge 构建 standalone-edge,最后分别探测 Grid、浏览器、驱动三个版本号——这正是打标签脚本所需版本信息的来源。
七、实践:如何使用 Edge 133 镜像
7.1 直接运行 node-edge 节点
按照 docs/docker-hub/node-edge.md 的指引,将 Edge 节点接入 Grid 的标准步骤为:
# 1. 创建 Docker 网络
docker network create grid
# 2. 启动 Hub
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.48.0-20260909
# 3. 启动 Edge 节点(使用本次发布的精确标签)
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="2g" \
selenium/node-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909
# 4. 将 WebDriver 测试指向 http://localhost:4444
关键注意点:
- 浏览器类镜像必须加
--shm-size=2g使用宿主机共享内存,否则浏览器易因 /dev/shm 空间不足而崩溃; - 推荐使用完整标签固定浏览器与 Grid 版本,而非
latest; - 可选:访问 http://localhost:7900/?autoconnect=1&resize=scale&password=secret 实时观察容器内浏览器画面(noVNC)。
7.2 使用 docker compose 编排
仓库根目录的 docker-compose-v3.yml 提供了 Hub + Chrome/Edge/Firefox 节点的完整编排示例,其中 Edge 服务配置为:
edge:
image: selenium/node-edge:4.48.0-20260905
platform: linux/amd64
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
可将镜像标签替换为本次发布的 selenium/node-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909,并执行 docker compose -f docker-compose-v3.yml up 启动。
7.3 独立运行 standalone-edge
若不需要完整 Grid 拓扑,可直接运行 standalone-edge(内含全部 Grid 组件):
docker run -d -p 4444:4444 --shm-size="2g" \
selenium/standalone-edge:133.0-edgedriver-133.0-grid-4.48.0-20260909
随后将测试的 WebDriver 指向 http://localhost:4444 即可运行远程 Edge 测试。
7.4 标签选择速查
基于 docs/docker-hub/node-edge.md 的标签规范,结合本次发布的实际标签,选择策略如下:
- 需要完全可复现:使用含完整版本的标签
133.0.3065.92-edgedriver-133.0.3065.92-grid-4.48.0-20260909; - 需要明确 Grid 版本:使用
133.0-edgedriver-133.0-grid-4.48.0-20260909(短版本 + Grid 版本); - 只需固定浏览器大版本:使用
133.0-20260909; - 新版本滚动标签(
133.0、133.0.3065.92等):仅在RELEASE_OLD_VERSION=false的全新发布中生成,适合持续跟随某条版本线的自动化场景。
八、小结
edge_133.md 这份发布日志虽然只有 20 行,却完整记录了一次浏览器镜像发布的打标签全过程。通过对照 tag_and_push_browser_images.sh、NodeEdge/Dockerfile、Makefile 和 docs/docker-hub/node-edge.md,可以清晰还原其背后的完整机制:
- 版本号由容器内实测获得,保证标签与镜像内容一致;
- 标签按"完整版本/短版本 × Grid/日期维度"组织,
RELEASE_OLD_VERSION控制是否追加滚动标签; - 同一组标签同时应用于 node-edge 与 standalone-edge 两个镜像;
PROMOTE_TAGS晋升路径通过buildx imagetools保留多架构特性。
理解这套标签机制后,无论是追溯历史版本、固定生产环境的镜像版本,还是参与镜像发布流程,都能准确、高效地完成。
如需查看其他浏览器在同一版本的发布记录,可对照 CHANGELOG/4.48.0/chrome-for-testing_133.md(Chrome for Testing 133.0.6943.141)等同类文档,其日志结构与本文完全一致。