news 2026/11/6 17:26:41

解读 docker-selenium 4.31.0 的 Firefox 119.0.1 镜像发布:标签生成机制与 GeckoDriver 版本组合全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解读 docker-selenium 4.31.0 的 Firefox 119.0.1 镜像发布:标签生成机制与 GeckoDriver 版本组合全解析
  • 测试
  • 后端
  • 云原生
  • 容器编排
  • 可观测性

【免费下载链接】docker-selenium

Provides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale

项目地址:https://gitcode.com/GitHub_Trending/do/docker-selenium
点击查看免费下载

在 docker-selenium 项目的版本发布流程中,每一个浏览器版本都会通过tag_and_push_browser_images.sh脚本生成一套完整的多维度镜像标签。本文以存档于 CHANGELOG/archived/4.31.0/firefox_119.md 的发布记录为线索,深入拆解 Selenium Grid 4.31.0 构建(构建日期 20250414)中 Firefox 119.0.1 与 GeckoDriver 0.36.0 的组合是如何被打包、打标签并推送的。读完本文,你将掌握 docker-selenium 的镜像标签命名约定、发布脚本的完整参数体系与底层执行逻辑,并能据此准确选择或复现任意浏览器版本的镜像标签。

发布记录本身说了什么

firefox_119.md本质上是一份脚本执行实录:它记录了为 Firefox 119 系列镜像打标签的完整命令与输出,核心信息如下:

  • 发布版本(Grid 版本 + 构建日期):4.31.0-20250414
  • Firefox 版本:119.0.1(短版本号119.0)
  • GeckoDriver 版本:0.36.0(短版本号0.36)
  • 涉及镜像:selenium/node-firefox与selenium/standalone-firefox
  • 推送开关:false(仅本地打标签,不推送)

这些信息对应仓库中 tag_and_push_browser_images.sh 的 firefox 分支在 4.31.0 时代的执行结果,是理解标签命名约定的最佳实战样本。

脚本参数体系:一行命令背后的七个入参

发布记录第一行的调用方式是:

./tag_and_push_browser_images.sh 4.31.0 20250414 selenium false firefox true

对照 tag_and_push_browser_images.sh 的头部定义,这 7 个位置参数分别是:

位置参数本次取值含义
1VERSION4.31.0Selenium Grid 版本
2BUILD_DATE20250414构建日期(YYYYMMDD)
3NAMESPACEselenium镜像命名空间(默认值)
4PUSH_IMAGEfalse是否执行 docker push(默认 false)
5BROWSERfirefox浏览器类型,脚本按此进入对应分支
6RELEASE_OLD_VERSIONtrue是否为旧版本补标签(默认 false)
7PLATFORM(省略,默认linux/amd64)目标平台

其中TAG_VERSION=${VERSION}-${BUILD_DATE}组成了后续所有标签中反复出现的grid-4.31.0-20250414后缀。

版本信息是怎么探测出来的

脚本并未硬编码 Firefox 与 GeckoDriver 的版本号,而是通过直接运行已构建镜像内的二进制来探测(tag_and_push_browser_images.sh):

FIREFOX_VERSION=$(docker run --rm ${NAMESPACE}/node-firefox:${TAG_VERSION} firefox --version | awk '{print $3}') FIREFOX_SHORT_VERSION="$(short_version ${FIREFOX_VERSION})" GECKODRIVER_VERSION=$(docker run --rm ${NAMESPACE}/node-firefox:${TAG_VERSION} geckodriver --version | awk 'NR==1{print $2}') GECKODRIVER_SHORT_VERSION="$(short_version ${GECKODRIVER_VERSION})"

关键点:

  • 探测路径是"先构建、后打标":要求selenium/node-firefox:4.31.0-20250414这个基础构建标签已经存在,脚本在其中运行firefox --version和geckodriver --version,用awk提取出版本号字段,再据此生成衍生标签。
  • 短版本号由short_version()函数截取:该函数把119.0.1按.分割后取前两段得到119.0(tag_and_push_browser_images.sh),所以发布记录中同时出现了119.0.1与119.0两套标签组。
  • Firefox 版本探测使用$3字段,与 generate_release_notes.sh 中生成发布说明的方式完全一致,两处相互印证。

标签组的构成:同一镜像的十种拉取方式

发布记录展示的标签可以归纳为两大组(每组 5 个标签、node 与 standalone 各一套):

完整版本号组(基于 119.0.1 / 0.36.0)

  • 119.0.1-geckodriver-0.36.0-grid-4.31.0-20250414
  • 119.0.1-geckodriver-0.36.0-20250414
  • 119.0.1-20250414
  • 119.0.1-geckodriver-0.36.0(由 RELEASE_OLD_VERSION=true 追加)
  • 119.0.1(由 RELEASE_OLD_VERSION=true 追加)

短版本号组(基于 119.0 / 0.36)

  • 119.0-geckodriver-0.36-grid-4.31.0-20250414
  • 119.0-geckodriver-0.36-20250414
  • 119.0-20250414
  • 119.0-geckodriver-0.36(由 RELEASE_OLD_VERSION=true 追加)
  • 119.0(由 RELEASE_OLD_VERSION=true 追加)

从 tag_and_push_browser_images.sh 的数组定义看,标签的构造遵循固定的三段式语义:

  1. 浏览器维度:Firefox 版本号(长/短);
  2. 驱动维度:geckodriver-<版本>(长/短,可选组合);
  3. Grid 维度:grid-<Grid版本>-<构建日期>(可选组合)。

RELEASE_OLD_VERSION参数决定是否追加"去掉构建日期"的纯版本标签。本次调用传入true,因此119.0.1-geckodriver-0.36.0、119.0.1、119.0-geckodriver-0.36、119.0四个短链标签也被生成,方便用户用最简标签拉取该构建。

retag()函数负责实际的打标与推送逻辑(tag_and_push_browser_images.sh):在PUSH_IMAGE=false时仅执行docker tag,为镜像赋予别名而不复制数据;当PUSH_IMAGE=true时则逐标签执行docker push。

标签约定的使用视角:用户该如何选择

结合 docs/docker-hub/node-firefox.md 对标签约定的说明,本次发布记录实际呈现了官方推荐的完整标签层级。以 Firefox 119.0.1、GeckoDriver 0.36.0、Grid 4.31.0、构建日期 20250414 为例,用户可按需选择:

  • 只需固定浏览器大版本:selenium/node-firefox:119.0
  • 需要精确到浏览器补丁版本:selenium/node-firefox:119.0.1
  • 同时固定浏览器与驱动:selenium/node-firefox:119.0.1-geckodriver-0.36.0
  • 全量锁定(浏览器 + 驱动 + Grid + 构建日期):selenium/node-firefox:119.0.1-geckodriver-0.36.0-grid-4.31.0-20250414

selenium/standalone-firefox的标签集合同理。这样的设计让用户可以像使用版本矩阵一样精确锁定测试环境:既可以在跨浏览器测试中快速切换到最新构建,也可以在遇到特定浏览器版本兼容问题时精确回退。

从发布记录反推构建端:Firefox 119 在镜像内如何落地

发布记录中的版本号并非随意组合,其来源可以追溯到 NodeFirefox/Dockerfile 的构建逻辑:

  • Firefox 安装:构建阶段通过FIREFOX_VERSION构建参数指定浏览器版本,amd64 平台下直接解析 Mozilla 官方下载地址(deb 或 tar.bz2),由 install-firefox-package.sh 完成下载与安装;安装完成后通过firefox --version | awk '{print $3}'把版本号写入/opt/selenium/browsers/firefox/version,供 Grid 节点上报浏览器信息(NodeFirefox/Dockerfile)。
  • GeckoDriver 安装:GECKODRIVER_VERSION构建参数默认为latest,此时会先解析 mozilla/geckodriver 仓库的最新 release 标签,再按架构(linux64 / linux-aarch64)下载对应压缩包解压到/opt,最终以符号链接形式暴露为/usr/bin/geckodriver(NodeFirefox/Dockerfile)。本次发布记录的0.36.0就是该解析流程在 4.31.0 构建时得到的实际版本。
  • 运行时观测:用户拿到镜像后也可自行执行docker run --rm selenium/node-firefox:119.0.1-geckodriver-0.36.0-grid-4.31.0-20250414 geckodriver --version来复核镜像内的驱动版本,这与发布脚本的探测手段完全一致。

发布记录在仓库中的定位:版本矩阵的一格

firefox_119.md属于 CHANGELOG/archived/4.31.0 存档目录。按照 CHANGELOG/README.md 的说明,CHANGELOG 维护着一张"Selenium Grid 版本 × 浏览器版本"的矩阵表,每个 ✓ 都链接到对应 Grid 发布下某个具体浏览器版本的详细变更记录,最新的 Grid 版本位于 CHANGELOG/4.48.0,历史版本则归档到 archived 目录。

对比同版本的其他浏览器记录(如 CHANGELOG/archived/4.31.0/edge_119.md)可以看出,这套标签机制对所有浏览器(chrome、chromium、edge、firefox、chrome-for-testing)是统一的:edge 记录中 Edge 119.0.2151.97 与 EdgeDriver 119.0.2151.97 遵循完全相同的"浏览器-驱动-grid-日期"四段式命名。而 Firefox 119 这条记录的特性在于驱动与浏览器版本号并不一致(119.0.1 vs 0.36.0),恰好说明了"驱动版本独立解析、独立参与标签命名"的设计。

此外,CHANGELOG/4.48.0/firefox_119.md 显示同样的 Firefox 119.0.1 在 4.48.0 构建中搭配的已是 GeckoDriver 0.37.1,这印证了一个重要事实:同一浏览器版本会随 Grid 发布迭代而更换驱动版本,因此标签中的 geckodriver 字段对精确复现测试环境至关重要。

如何在实际项目中使用这些标签

在 compose 编排中使用固定标签,例如 docker-compose-v3.yml 中节点镜像的写法,只需将latest替换为发布记录中的全量标签即可:

services: firefox: image: selenium/node-firefox:119.0.1-geckodriver-0.36.0-grid-4.31.0-20250414 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

若使用裸docker run启动 Node,则对应 docs/docker-hub/node-firefox.md 的写法:

docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ --shm-size="2g" \ selenium/node-firefox:119.0.1-geckodriver-0.36.0-grid-4.31.0-20250414

几点实践建议:

  • 生产与回归环境优先使用全量标签(含grid-与日期),确保浏览器、驱动、Grid 与构建产物完全一致;
  • 需要跟随浏览器小版本修复时,可用短版本标签如119.0平衡稳定性与更新频率;
  • 由于仓库明确说明并未对每个 Grid 与浏览器版本的组合做全量测试(CHANGELOG/README.md),切换到非默认组合前应结合自身测试需求评估。

小结

firefox_119.md表面上只是一段打标日志,实则完整呈现了 docker-selenium 发布流水线的核心环节:镜像先以4.31.0-20250414构建标签产出,脚本再通过运行时探测 Firefox 119.0.1 与 GeckoDriver 0.36.0 的精确版本,按"浏览器版本 / 浏览器+驱动版本 / 浏览器+驱动+Grid 版本 / 短版本号"四个维度生成十种等价标签,分别指向 node 与 standalone 两种镜像形态。理解这条标签生成链路后,无论是挑选现成镜像还是自行维护浏览器版本组合,都能快速定位到正确的镜像标签。

  • 测试
  • 后端
  • 云原生
  • 容器编排
  • 可观测性

【免费下载链接】docker-selenium

Provides a simple way to run Selenium Grid with Chrome, Firefox, and Edge using Container Platform, making it easier to perform browser automation at scale

项目地址:https://gitcode.com/GitHub_Trending/do/docker-selenium
点击查看免费下载

相关推荐

上一篇:ESLint 文档站代码块正误标记:`::: correct` / `::: incorrect` 容器组件全解析
下一篇:Haystack InMemoryDocumentStore 完全指南:从 BM25 与向量检索到元数据过滤与异步 API

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 1:21:31

注塑模具钢

做一副注塑模具&#xff0c;模具钢怎么选&#xff1f;模具钢的选择是注塑模具设计中的重要的一环&#xff0c;模具钢类型会直接影响模具寿命、制品质量与制造成本。 在模具总成本中&#xff0c;钢材费用通常占30%&#xff5e;50%。然而&#xff0c;选材并非越贵越好&#xff1a…

作者头像 李华
网站建设 2026/10/26 8:32:05

Flink SQL MySQl数据同步到ES数量未对齐的问题

目录问题背景排除过程排除出未同步的商品数据打开ES新增修改日志打开Flink debug日志发现解决方案参考问题背景 使用Flink SQL把MySQL的商品数据同步到ES&#xff0c;发现ES的数据条数总是会少一些。SQL大概是这样的&#xff1a; -- 商品数据以及这个商品对应实物最小克重 IN…

作者头像 李华
网站建设 2026/10/26 2:10:40

一句话变短视频:Pixelle-Video 零剪辑全自动出片

一句话变短视频&#xff1a;Pixelle-Video 零剪辑全自动出片 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video 是一款开源的…

作者头像 李华
网站建设 2026/10/25 20:37:21

t3code全栈脚手架:T3 Stack类型安全开发实战

t3code这个名字&#xff0c;第一眼看上去很难猜到是干什么的&#xff0c;但如果你接触过T3 Stack&#xff0c;应该会心一笑。它不是某个游戏外挂的代号&#xff0c;而是一套围绕"全栈TypeScript 类型安全"打造的代码生成与项目脚手架体系。我最早接触它&#xff0c;…

作者头像 李华
网站建设 2026/10/25 6:58:48

第8章 后端Web实战(登录认证)

一、登录功能-实现 创建pojo实体类LoginInfo public class LoginInfo {private Integer id;private String username;private String name;private String token; } 创建控制层LoginController Slf4j RestController public class LoginController { ​Autowiredprivate Em…

作者头像 李华