docker-selenium 4.48.0 的 Edge 133 镜像打标签全流程解析:从 tag_and_push_browser_images.sh 到 node-edge 镜像标签规范

原创2026-10-02 17:18:471,034 阅读
文章标签:测试后端云原生容器编排可观测性

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)等同类文档,其日志结构与本文完全一致。

登录后查看全文
docker-selenium