☰
docker-selenium 浏览器镜像 Tag 机制解析:以 Selenium Grid 4.34.0 + Firefox 114.0.2 发布记录为例
2026/10/9 1:59:03 网站建设 项目流程
  • 测试
  • 后端
  • 云原生
  • 容器编排
  • 可观测性

【免费下载链接】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 仓库归档的发布记录 CHANGELOG/archived/4.34.0/firefox_114.md,深入剖析 Selenium Grid 4.34.0 构建日期 20250727 中 Firefox 镜像的 Tag 命名规范、生成流程与底层实现。通过阅读本文,你将掌握node-firefox与standalone-firefox镜像从构建、版本探测到多格式打标、推送的完整链路,理解长短版本号、GeckoDriver 版本、Grid 版本与构建日期在 Tag 中的组合规则,并能够在自己的发布流程中复现这一套脚本化的 Tag 管理方法。

一、这份发布记录记录了什么

firefox_114.md是 4.34.0 版本浏览器镜像发布日志中针对 Firefox 的部分(同目录下还有chrome_114.md、edge_114.md等同类记录),完整保留了一次真实发布命令的执行输出。其核心内容如下:

./tag_and_push_browser_images.sh 4.34.0 20250727 selenium false firefox true

命令执行后输出了本次发布的关键版本事实:

  • Selenium Grid 版本:4.34.0-20250727
  • Firefox 版本:114.0.2(短版本114.0)
  • GeckoDriver 版本:0.36.0(短版本0.36)

这四个版本号构成了后续所有镜像 Tag 的命名原料。该脚本位于仓库根目录 tag_and_push_browser_images.sh,是浏览器镜像发布打标的统一入口。

二、命令参数逐项解读

发布命令共携带 7 个参数,与脚本头部的参数解析一一对应(tag_and_push_browser_images.sh):

位置本记录中的值参数名含义
$14.34.0VERSIONSelenium Grid 版本号
$220250727BUILD_DATE构建日期,TAG_VERSION=${VERSION}-${BUILD_DATE}拼接成4.34.0-20250727
$3seleniumNAMESPACE镜像命名空间(仓库名),最终镜像名为selenium/node-firefox等
$4falsePUSH_IMAGE是否执行docker push,false表示本次只打标不推送
$5firefoxBROWSER浏览器类型,脚本内通过case分支分发处理逻辑
$6trueRELEASE_OLD_VERSION是否为旧版本补发 Tag。true时只打基础 6 种 Tag,false时追加 4 种"裸版本" Tag
$7未传PLATFORM目标平台,默认linux/amd64

值得注意:第 6 个参数true直接决定了本次输出只有 6 种 Tag 模式。查看脚本 firefox 分支可知,FIREFOX_TAGS数组的基础成员固定为 6 个,而当RELEASE_OLD_VERSION=false时会再追加 4 个成员(见下文第四节),这也是归档版本只打精简 Tag 的设计考量。

三、本次发布生成的 12 个镜像 Tag 全清单

以node-firefox与standalone-firefox两个镜像为准,本次共生成 12 个 Tag,可归纳为 6 组一一对应的模式:

序号Tag(node-firefox / standalone-firefox 各一份)命名模式
1114.0.2-geckodriver-0.36.0-grid-4.34.0-20250727完整版本 + 驱动完整版本 + Grid 完整版本
2114.0.2-geckodriver-0.36.0-20250727完整版本 + 驱动完整版本 + 构建日期
3114.0.2-20250727浏览器完整版本 + 构建日期
4114.0-geckodriver-0.36-grid-4.34.0-20250727短版本 + 驱动短版本 + Grid 完整版本
5114.0-geckodriver-0.36-20250727短版本 + 驱动短版本 + 构建日期
6114.0-20250727浏览器短版本 + 构建日期

这 6 组模式在脚本中的定义位置为 tag_and_push_browser_images.sh,脚本注释明确区分了"Browser version and browser driver version plus build date"、"Browser version and build date"与短版本(Short versions)三类语义,方便使用者按不同精确度拉取镜像。

四、脚本实现原理:从版本探测到批量打标

4.1 版本探测:容器内自报版本

脚本并不假设版本号,而是直接运行已构建的镜像,让容器内的二进制自报版本(firefox 分支,tag_and_push_browser_images.sh):

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 114.0.2,取第 3 列得到114.0.2;
  • geckodriver --version首行即为版本号,取NR==1的第 2 列得到0.36.0。

这一设计保证了 Tag 与镜像内真实软件版本严格一致,避免了硬编码漂移。

4.2 短版本截取

short_version()函数(tag_and_push_browser_images.sh)按.切分版本号并只取前两段:

function short_version() { local __long_version=$1 local __version_split=(${__long_version//./ }) echo "${__version_split[0]}.${__version_split[1]}" }

因此114.0.2→114.0,0.36.0→0.36,与发布日志输出的 "Short Firefox version -> 114.0"、"Short GeckoDriver version -> 0.36" 完全吻合。

4.3 打标与推送:retag函数

retag()(tag_and_push_browser_images.sh)承担核心动作:本地docker tag后按PUSH_IMAGE决定是否docker push。脚本末尾对FIREFOX_TAGS数组逐项循环,同时为node-firefox与standalone-firefox各打一份(tag_and_push_browser_images.sh),这就是 12 个 Tag(6 模式 × 2 镜像)的由来。

4.4 常规发布会额外追加 4 组 Tag

当RELEASE_OLD_VERSION=false(即常规版本发布)时,脚本追加以下 4 个成员(tag_and_push_browser_images.sh):

  • 114.0.2-geckodriver-0.36.0:浏览器完整版本 + 驱动完整版本
  • 114.0.2:浏览器完整版本
  • 114.0-geckodriver-0.36:短版本 + 驱动短版本
  • 114.0:浏览器短版本

从源码结构看,这些"裸版本" Tag 是给用户提供最简洁的拉取入口(如selenium/node-firefox:114.0),而归档旧版本时省略它们以降低维护成本。本记录因第 6 个参数为true,故输出中未包含这 4 组。

五、Firefox 镜像构建侧源码印证

版本探测之所以可靠,是因为镜像构建时已固化软件版本并写入元信息。见 NodeFirefox/Dockerfile:

5.1 Firefox 本体安装策略

构建参数FIREFOX_VERSION=latest、FIREFOX_DOWNLOAD_URL、FIREFOX_LANG_VERSION控制安装方式(NodeFirefox/Dockerfile):

  • 对latest/beta-latest/nightly-latest/devedition-latest/esr-latest及 Firefox 136+ 使用 Mozilla 官方 APT 仓库(脚本 NodeFirefox/install-firefox-apt.sh 完成 keyring 安装与Pin-Priority: 1000偏好设置);
  • 对具体版本号走 NodeFirefox/install-firefox-package.sh,优先下载官方.deb包,404 时回退.tar.bz2,并对 beta/nightly/dev/esr 建立/usr/bin/firefox软链;
  • 随后执行 NodeFirefox/get_lang_package.sh 下载对应版本的全部语言包到distribution/extensions。

5.2 GeckoDriver 安装

GECKODRIVER_VERSION=latest时动态解析上游最新发布,按架构选择linux64或linux-aarch64压缩包,解压到/opt/geckodriver-$GK_VERSION并软链到/usr/bin/geckodriver(NodeFirefox/Dockerfile)。

5.3 浏览器信息落盘

构建末尾将版本信息写入/opt/selenium/browsers/firefox/,供 Grid Node 注册时上报(NodeFirefox/Dockerfile):

RUN mkdir -p /opt/selenium/browsers/firefox \ && echo "firefox" > /opt/selenium/browsers/firefox/name \ && firefox --version | awk '{print $3}' > /opt/selenium/browsers/firefox/version \ && echo '{"moz:firefoxOptions": {"binary": "${SE_BROWSER_BINARY_LOCATION:-/usr/bin/firefox}"}}' > /opt/selenium/browsers/firefox/binary_location

同时设置SE_OTEL_SERVICE_NAME="selenium-node-firefox"与SE_NODE_ENABLE_MANAGED_DOWNLOADS="true"(NodeFirefox/Dockerfile)。

5.4 构建入口与升级验证

Makefile 提供firefox/firefox_only构建目标(firefox: node_base firefox_only),并支持FIREFOX_DOWNLOAD_URL覆盖;Makefile 的tag_and_push_firefox_images目标正是本次发布命令的 Make 封装:

tag_and_push_firefox_images: ./tag_and_push_browser_images.sh $(VERSION) $(BUILD_DATE) $(NAMESPACE) $(PUSH_IMAGE) firefox $(RELEASE_OLD_VERSION)

而firefox_upgrade_version目标(Makefile)在升级后依次验证selenium-server.jar、firefox --version、geckodriver --version三者的版本一致性。

六、使用这些镜像运行 Firefox 自动化

6.1 单容器快速体验

docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-firefox:4.48.0-20260905

其中--shm-size="2g"是 Selenium 容器公认的推荐配置(README 中 README.md 明确建议),端口 4444 为 Grid 入口,7900 为 noVNC 可视化调试入口。Firefox 依赖共享内存运行,容量不足会导致浏览器崩溃。

6.2 接入分布式 Grid

在 Hub + Node 模式下,将node-firefox挂入selenium-hub并通过事件总线通信,参见 docker-compose-v3.yml 的 firefox 服务定义:

firefox: image: selenium/node-firefox:4.48.0-20260905 shm_size: 2gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub

在多浏览器 Node 上,可通过环境变量SE_NODE_ENABLE_BROWSER_FIREFOX=false按需关闭 Firefox 能力(README 多架构矩阵一节 README.md)。

6.3 设置浏览器语言与区域

Firefox 的语言/区域需同时设置 profile 偏好并安装语言包 add-on(README.md):

profile = webdriver.FirefoxProfile() profile.set_preference('intl.accept_languages', 'vi-VN,vi') profile.set_preference('intl.locale.requested', 'vi-VN,vi') options = FirefoxOptions() options.profile = profile driver = webdriver.Remote(options=options, command_executor="http://selenium-hub:4444/wd/hub") webdriver.Firefox.install_addon(driver, "/local/path/to/vi.xpi")

语言包可借助 NodeFirefox/get_lang_package.sh 批量获取(README.md):

FIREFOX_VERSION=$(docker run --rm --entrypoint="" selenium/node-firefox:latest firefox --version | awk '{print $3}') \ && ./NodeFirefox/get_lang_package.sh ${FIREFOX_VERSION} /local/path/to/download

七、僵尸进程清理与运维保障

镜像内置了 Firefox 专用清理守护进程 NodeFirefox/firefox-cleanup.sh,按周期找出运行超过阈值秒数的firefox-bin进程并kill -9,配合 NodeFirefox/firefox-cleanup.conf 注册到 supervisord(priority=20,由SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP控制启停)。

相关环境变量及默认值记录在 ENV_VARIABLES.md:

环境变量默认值说明
SE_BROWSER_LEFTOVERS_PROCESSES_SECS7200超过该存活秒数的 Firefox 进程将被清理
SE_BROWSER_LEFTOVERS_INTERVAL_SECS3600清理守护进程的检查间隔
SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS1/tmp残留临时文件清理天数(Firefox 场景忽略)

结语

通过一份归档的 Firefox 发布日志,本文完整还原了 docker-selenium 浏览器镜像 Tag 生成的工程闭环:构建期在 NodeFirefox/Dockerfile 内固化浏览器与驱动版本,发布期由 tag_and_push_browser_images.sh 以容器自报版本为准生成 6 至 10 组语义化 Tag,再经 Make 目标 Makefile 统一编排。理解了这套机制,无论是追溯历史版本(如114.0-geckodriver-0.36-grid-4.34.0-20250727)、按需拉取精简 Tag(如114.0),还是自定义镜像版本管理流程,都能做到有据可依、可复现、可验证。

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

【免费下载链接】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
点击查看免费下载

相关推荐

上一篇:SonarQube界面定制实战:打造企业级代码质量管理平台
下一篇:POCO C++库:构建网络应用的完整开发框架指南

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询