docker-selenium 4.48.0 Firefox 镜像发布记录解析:126.0.1 与 GeckoDriver 0.37.1 的标签体系与构建机制
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/ 下的发布记录,也能据此选择合适的镜像标签并验证环境一致性。