docker-selenium 4.48.0 Firefox 镜像发布记录解析:126.0.1 与 GeckoDriver 0.37.1 的标签体系与构建机制

原创2026-10-03 22:05:041,658 阅读
文章标签:测试后端容器编排

docker-selenium 4.48.0 Firefox 镜像发布记录解析:126.0.1 与 GeckoDriver 0.37.1 的标签体系与构建机制

本文基于 docker-selenium 仓库中 4.48.0 版本的 Firefox 发布记录,完整解析该版本 node-firefox 与 standalone-firefox 镜像的版本组合、标签命名规则与发布命令,并结合 tag_and_push_browser_images.sh 与 NodeFirefox/Dockerfile 等源码,说明 Firefox 126.0.1 镜像在实际构建、打标签与使用中的底层机制。读者读完后,将能够看懂该发布记录中每一行输出的含义、独立复现镜像标签,并理解 Firefox 镜像内浏览器与驱动的安装与清理逻辑。

发布记录概述:4.48.0 版 Firefox 镜像的版本快照

firefox_126.md 是 4.48.0 版本发布过程中 Firefox 浏览器镜像的标签输出存档。该记录表明,本次发布对应的镜像组合为:

  • Selenium Grid 版本:4.48.0-20260909(构建日期 2026-09-09)
  • Firefox 版本:126.0.1(短版本号 126.0)
  • GeckoDriver 版本:0.37.1(短版本号 0.37)

发布命令为:

./tag_and_push_browser_images.sh 4.48.0 20260909 selenium false firefox true

这条命令由 tag_and_push_browser_images.sh 解析执行,调用参数与脚本定义的形参一一对应:VERSION=4.48.0、BUILD_DATE=20260909、NAMESPACE=selenium、PUSH_IMAGE=false(第 4 个参数,此处输出为 false,即只打标签不推送)、BROWSER=firefox,以及第 6 个参数 RELEASE_OLD_VERSION=true(即发布旧版本时执行的分支)。仓库根目录的 Makefile 中定义了 tag_and_push_browser_images 目标,发布流程通常由该目标驱动。

标签命名体系:五组标签的构成与含义

从 firefox_126.md 可以看到,每个浏览器镜像(node-firefox 与 standalone-firefox)各生成 10 个标签。这些标签由 tag_and_push_browser_images.sh 的 firefox 分支动态生成,生成规则如下。

版本信息探测

脚本在打标签前,通过临时运行已构建的 selenium/node-firefox:4.48.0-20260909 容器来探测容器内实际安装的版本:

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

即 firefox --version 输出(例如 Mozilla Firefox 126.0.1)的第 3 个字段作为 Firefox 版本,geckodriver --version 输出首行的第 2 个字段作为 GeckoDriver 版本。随后通过 short_version() 函数取主、次版本组成短版本号:126.0.1 → 126.0,0.37.1 → 0.37。

标签矩阵

FIREFOX_TAGS 数组按顺序生成 5 组标签,每组同时作用于 node-firefox 与 standalone-firefox 两个镜像,因此输出中正好出现 10 行 Tagged ...:

组别 标签格式 本版本示例(node-firefox)
1 ${FIREFOX_VERSION}-geckodriver-${GECKODRIVER_VERSION}-grid-${TAG_VERSION} 126.0.1-geckodriver-0.37.1-grid-4.48.0-20260909
2 ${FIREFOX_VERSION}-geckodriver-${GECKODRIVER_VERSION}-${BUILD_DATE} 126.0.1-geckodriver-0.37.1-20260909
3 ${FIREFOX_VERSION}-${BUILD_DATE} 126.0.1-20260909
4 ${FIREFOX_SHORT_VERSION}-geckodriver-${GECKODRIVER_SHORT_VERSION}-grid-${TAG_VERSION} 126.0-geckodriver-0.37-grid-4.48.0-20260909
5 ${FIREFOX_SHORT_VERSION}-geckodriver-${GECKODRIVER_SHORT_VERSION}-${BUILD_DATE} 126.0-geckodriver-0.37-20260909
6 ${FIREFOX_SHORT_VERSION}-${BUILD_DATE} 126.0-20260909

需要说明的是,由于本次发布传入 RELEASE_OLD_VERSION=true,脚本不再追加第 219-229 行中那些不含 grid 与构建日期的纯版本标签(如 126.0.1-geckodriver-0.37.1、126.0.1、126.0)。对比同目录的 firefox_125.md 可以发现,Firefox 125 记录同样以 true 结尾、输出 10 行标签,说明两个版本采用了相同的发布策略;而其他未带 true 的发布记录会输出包含纯版本标签在内的更多标签行。

打标签与推送

retag() 函数(tag_and_push_browser_images.sh)是标签落地的核心:当 PROMOTE_TAGS=true 时使用 docker buildx imagetools create 在 registry 之间直接创建多架构 manifest 标签;常规路径下则使用 docker tag 为本地镜像打标签,并在 PUSH_IMAGE=true 时逐个 docker push。本次命令第 4 个参数为 false,故只执行 docker tag。

镜像构建机制:Firefox 与 GeckoDriver 如何进入镜像

发布记录中的版本号最终由 NodeFirefox/Dockerfile 的构建逻辑决定,该文件从 selenium/node-base 基础镜像继承而来,并以构建参数 FIREFOX_VERSION、FIREFOX_DOWNLOAD_URL、FIREFOX_LANG_VERSION、GECKODRIVER_VERSION 控制安装内容。

Firefox 的安装路径

Dockerfile 中 Firefox 安装逻辑(NodeFirefox/Dockerfile)根据目标架构与版本号分派安装方式:

  • amd64 或版本号 ≥ 136:优先使用 Mozilla 官方 apt 仓库,通过 install-firefox-apt.sh 安装 firefox 或 firefox-beta、firefox-nightly、firefox-devedition、firefox-esr 等通道;对数值型版本则先尝试从 download-installer.cdn.mozilla.net 下载 .deb 包,若返回 404 则回退到 tar.bz2;
  • aarch64 且版本号 < 136:走 install-firefox-package.sh 的 tar.bz2/tar.xz 解包路径,解压到 /opt/firefox-${FIREFOX_VERSION} 并通过软链 ln -fs ... /usr/bin/firefox 暴露为系统命令,同时创建 /opt/firefox-${FIREFOX_VERSION}/distribution/extensions 目录用于语言包。

安装完成后还会执行一次 apt-get upgrade 以修复 Firefox 依赖中的已知 CVE(NodeFirefox/Dockerfile),并调用 get_lang_package.sh 下载对应版本的语言包。

GeckoDriver 的安装

GeckoDriver 安装段(NodeFirefox/Dockerfile)先请求 github.com/mozilla/geckodriver/releases/latest 的重定向 URL 解析最新版本,再按架构选择 linux64 或 linux-aarch64 压缩包,下载解压后放入 /opt/geckodriver-${GK_VERSION} 并软链至 /usr/bin/geckodriver。构建完成后,/opt/selenium/browsers/firefox/version 会写入实际 Firefox 版本号,/opt/selenium/browsers/firefox/binary_location 则写入:

{"moz:firefoxOptions": {"binary": "${SE_BROWSER_BINARY_LOCATION:-/usr/bin/firefox}"}}

供 Selenium Grid 的 Firefox 节点在注册时上报浏览器二进制信息(见 NodeFirefox/Dockerfile)。

运行期守护机制:残留进程清理与语言包

  • 清理守护进程:firefox-cleanup.conf 通过 supervisord 按 SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP 环境变量控制是否启动 firefox-cleanup.sh(优先级 20)。脚本以循环方式每隔 SE_BROWSER_LEFTOVERS_INTERVAL_SECS 秒扫描一次,用 kill -9 结束运行超过 SE_BROWSER_LEFTOVERS_PROCESSES_SECS 秒的 firefox-bin 残留进程(firefox-cleanup.sh)。相关环境变量的默认值与取值说明可参考 ENV_VARIABLES.md。
  • 语言包:get_lang_package.sh 以版本号为参数,从 ftp.mozilla.org/pub/firefox/releases/<VERSION>/linux-x86_64/xpi/ 拉取全部 langpack-*.xpi 到 <firefox>/distribution/extensions/ 目录;若该版本目录返回 404,会自动回退到 Mozilla 最新稳定版(通过 firefox_versions.json 查询),并以 langpack-<语言>@firefox.mozilla.org.xpi 命名,使 Firefox 在运行时自动加载。

使用建议:如何选择与验证标签

日常使用中,建议优先选择同时包含浏览器版本、驱动版本与 grid 版本的完整标签,例如 selenium/node-firefox:126.0.1-geckodriver-0.37.1-grid-4.48.0-20260909,它可精确锁定本次发布记录对应的软件组合;如需更短写法,可选用 selenium/standalone-firefox:126.0-20260909 这类短版本标签。

拉取后可通过如下命令验证容器内的实际版本与发布记录是否一致:

docker run --rm selenium/node-firefox:126.0.1-geckodriver-0.37.1-grid-4.48.0-20260909 firefox --version
docker run --rm selenium/node-firefox:126.0.1-geckodriver-0.37.1-grid-4.48.0-20260909 geckodriver --version

将输出分别与发布记录中的 Firefox version -> 126.0.1 和 GeckoDriver version -> 0.37.1 对照。若需要以固定版本运行 Grid,可参考 docker-compose-v3.yml 等编排文件,将镜像 tag 替换为上述完整标签;Firefox 节点的运行配置(如浏览器二进制路径与 moz:firefoxOptions)由 NodeFirefox/Dockerfile 写入的 browser 信息目录提供。

小结

firefox_126.md 虽然只是一份发布时的打标签输出存档,但它精确记录了 docker-selenium 4.48.0 版本中 Firefox 126.0.1 + GeckoDriver 0.37.1 的镜像组合,以及 node-firefox/standalone-firefox 双镜像、6 组标签矩阵的命名约定。结合 tag_and_push_browser_images.sh 的脚本逻辑与 NodeFirefox/Dockerfile 的构建实现,开发者既能读懂任意一份 CHANGELOG/4.48.0/ 下的发布记录,也能据此选择合适的镜像标签并验证环境一致性。

登录后查看全文
docker-selenium