- 测试
- 后端
- 云原生
- 容器编排
- 可观测性
【免费下载链接】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
导读
本文以 docker-selenium 仓库中 CHANGELOG/archived/4.28.1/firefox_116.md 记录的 4.28.1 版本 Firefox 116 镜像打标日志为入口,深入拆解 Selenium Grid 4.28.1-20250202 版本下 Firefox 116.0.3 与 GeckoDriver 0.35.0 的组合镜像所生成的全部 12 个标签。读者读完将掌握 docker-selenium 浏览器镜像的标签命名规范、tag_and_push_browser_images.sh脚本的完整执行流程、版本探测与打标原理,以及如何为 Node/Standalone Firefox 镜像选择正确的固定版本标签。
一、文档定位:版本矩阵中的一张"打标证据卡"
firefox_116.md是 docker-selenium 项目版本矩阵体系的产物之一。在 CHANGELOG/README.md 中,每个 Grid 版本(如 4.28.1)都对应一张"Grid 版本 × 浏览器版本"矩阵表,表中的每个 ✓ 都链接到对应浏览器版本的详细 changelog 文档。该文档的动机是:在持续跟进最新 Selenium Grid 核心版本的同时,允许用户固定浏览器版本进行跨浏览器测试或规避特定版本缺陷——用户只需找到镜像标签、拉取镜像即可开始测试。
firefox_116.md记录的正是 4.28.1 发布时,为 Firefox 116 系列镜像执行打标脚本的完整输出。它虽然不是一篇教程,但包含了可复现的命令、确切的版本信息和完整的标签清单,是理解 docker-selenium 浏览器镜像标签体系的最佳一手素材。
二、命令全景:一条命令生成 12 个 Firefox 镜像标签
原文档以代码块形式记录了核心命令及其全部输出:
./tag_and_push_browser_images.sh 4.28.1 20250202 selenium false firefox true Tagging images for browser firefox, version 4.28.1, build date 20250202, namespace selenium Selenium Grid version -> 4.28.1-20250202 Firefox version -> 116.0.3 Short Firefox version -> 116.0 GeckoDriver version -> 0.35.0 Short GeckoDriver version -> 0.35该脚本位于仓库根目录 tag_and_push_browser_images.sh,其参数定义在脚本开头(L3-L13):
| 参数位置 | 变量名 | 本次取值 | 含义 |
|---|---|---|---|
| 1 | VERSION | 4.28.1 | Selenium Grid 版本号 |
| 2 | BUILD_DATE | 20250202 | 构建日期(YYYYMMDD) |
| 3 | NAMESPACE | selenium | 镜像仓库命名空间 |
| 4 | PUSH_IMAGE | false | 是否推送镜像到仓库,默认false |
| 5 | BROWSER | firefox | 目标浏览器,可选chrome/chromium/edge/firefox/chrome-for-testing |
| 6 | RELEASE_OLD_VERSION | true | 是否为旧版本补发标签,默认false |
其中第 4 个参数在脚本中被解析为PUSH_IMAGE="${4:-false}"(L6),第 6 个参数为RELEASE_OLD_VERSION="${6:-false}"(L8)。本次PUSH_IMAGE=false意味着只执行本地docker tag,不执行docker push。
在 Makefile 中,这一命令被封装为tag_and_push_firefox_images目标(L795-796):
tag_and_push_firefox_images: ./tag_and_push_browser_images.sh $(VERSION) $(BUILD_DATE) $(NAMESPACE) $(PUSH_IMAGE) firefox $(RELEASE_OLD_VERSION)其上层目标是tag_and_push_browser_images(L781),由 chrome、chrome-for-testing、chromium、edge、firefox 五个子目标串联而成,对应"附加浏览器镜像标签"的发布流程(仓库注释引用了 issue #992,说明这些附加标签的由来)。
三、版本探测:从已构建镜像内部读取真实版本
打标脚本并不会凭空猜测版本号,而是运行已构建好的镜像并执行二进制文件来探测版本。以 firefox 分支为例(tag_and_push_browser_images.sh):
FIREFOX_VERSION=$(docker run --rm ${NAMESPACE}/node-firefox:${TAG_VERSION} firefox --version | awk '{print $3}') echo "Firefox version -> "${FIREFOX_VERSION} FIREFOX_SHORT_VERSION="$(short_version ${FIREFOX_VERSION})" echo "Short Firefox version -> "${FIREFOX_SHORT_VERSION} GECKODRIVER_VERSION=$(docker run --rm ${NAMESPACE}/node-firefox:${TAG_VERSION} geckodriver --version | awk 'NR==1{print $2}') echo "GeckoDriver version -> "${GECKODRIVER_VERSION} GECKODRIVER_SHORT_VERSION="$(short_version ${GECKODRIVER_VERSION})" echo "Short GeckoDriver version -> "${GECKODRIVER_SHORT_VERSION}关键点:
- 探测基准镜像名为
selenium/node-firefox:4.28.1-20250202(TAG_VERSION=${VERSION}-${BUILD_DATE},脚本 L15); - Firefox 版本通过
firefox --version输出第 3 列取得(awk '{print $3}'),得到116.0.3; - GeckoDriver 版本通过
geckodriver --version第一行的第 2 列取得,得到0.35.0; - "短版本号"由脚本定义的
short_version函数计算(L53-L57),只保留主版本.次版本两位:
function short_version() { local __long_version=$1 local __version_split=(${__long_version//./ }) echo "${__version_split[0]}.${__version_split[1]}" }因此116.0.3 → 116.0,0.35.0 → 0.35。短版本标签的存在,让用户无需记住完整的 Patch 号即可拉取"该版本线的最近发布"。
这种"镜像内自检"的设计保证了标签与实际二进制绝对一致——标签上写什么版本,容器里就是什么版本,杜绝了构建参数与产物不一致的风险。在 Makefile 的firefox_upgrade_version目标中也能看到同样的验证手法:构建后立即docker run校验 Selenium Server、Firefox、GeckoDriver 三个版本。
四、标签命名规范:12 个标签的构成逻辑
原文档列出了 4.28.1 发布时为 Firefox 116 生成的完整标签清单(Node 与 Standalone 各 6 个,共 12 个):
selenium/node-firefox:116.0.3-geckodriver-0.35.0-grid-4.28.1-20250202 selenium/standalone-firefox:116.0.3-geckodriver-0.35.0-grid-4.28.1-20250202 selenium/node-firefox:116.0.3-geckodriver-0.35.0-20250202 selenium/standalone-firefox:116.0.3-geckodriver-0.35.0-20250202 selenium/node-firefox:116.0.3-20250202 selenium/standalone-firefox:116.0.3-20250202 selenium/node-firefox:116.0-geckodriver-0.35-grid-4.28.1-20250202 selenium/standalone-firefox:116.0-geckodriver-0.35-grid-4.28.1-20250202 selenium/node-firefox:116.0-geckodriver-0.35-20250202 selenium/standalone-firefox:116.0-geckodriver-0.35-20250202 selenium/node-firefox:116.0-20250202 selenium/standalone-firefox:116.0-20250202对照脚本中的FIREFOX_TAGS数组定义(tag_and_push_browser_images.sh),这些标签按"详细度递减"分为三组:
- 全版本组合(最精确):
<浏览器>.<Patch>-geckodriver-<驱动>.<驱动Patch>-grid-<Grid>.<构建日期>,即116.0.3-geckodriver-0.35.0-grid-4.28.1-20250202,唯一确定一个精确到 Patch 的发布组合; - 浏览器版本 + 构建日期:
<浏览器>.<Patch>-geckodriver-<驱动>.<驱动Patch>-<构建日期>与<浏览器>.<Patch>-<构建日期>,适合在同一天发布中锁定浏览器与驱动; - 短版本组合(语义简化):
116.0-geckodriver-0.35-grid-4.28.1-20250202、116.0-geckodriver-0.35-20250202、116.0-20250202,忽略 Patch 号,让标签更短更易读。
每个标签都通过retag函数同时作用于node-firefox与standalone-firefox两个镜像(脚本 L232-L235),这也是为什么输出中总是成对出现。
旧版本补发的额外标签
由于本次RELEASE_OLD_VERSION=true,脚本跳过了 L219-L230 的追加逻辑(该逻辑仅在RELEASE_OLD_VERSION=false时执行)。若为新版本发布(第 6 个参数为false),还会额外追加 4 个不含构建日期的"滚动式"标签:
FIREFOX_TAGS+=( ${FIREFOX_VERSION}-geckodriver-${GECKODRIVER_VERSION} # 116.0.3-geckodriver-0.35.0 ${FIREFOX_VERSION} # 116.0.3 ${FIREFOX_SHORT_VERSION}-geckodriver-${GECKODRIVER_SHORT_VERSION} # 116.0-geckodriver-0.35 ${FIREFOX_SHORT_VERSION} # 116.0 )对比同一仓库最新版本 CHANGELOG/4.48.0/firefox_152.md 可以看到,新版本发布时输出仍为 12 个标签,但第 6 个参数为true(旧版本归档)。这一参数机制保证了旧版补发不会覆盖新版的滚动标签,避免116.0这类短标签被历史版本反复改写。
五、retag 函数:本地打标与多架构镜像处理
所有标签最终经由retag函数落地(tag_and_push_browser_images.sh):
function retag() { local __image=$1 local __tag=$2 local __source="${NAMESPACE}/${__image}:${TAG_VERSION}" if [ "${PROMOTE_TAGS}" = "true" ]; then docker buildx imagetools create "${__targets[@]}" "${__source}" echo "Tagged ${NAMESPACE}/${__image}:${__tag}" return fi docker tag "${__source}" "${NAMESPACE}/${__image}:${__tag}" echo "Tagged ${NAMESPACE}/${__image}:${__tag}" if [ "${PUSH_IMAGE}" = true ]; then docker push "${NAMESPACE}/${__image}:${__tag}" fi }该函数支持两种模式:
- 默认模式:源镜像为
selenium/node-firefox:4.28.1-20250202,执行docker tag追加新标签;若PUSH_IMAGE=true再执行docker push; - PROMOTE_TAGS 模式(由
PROMOTE_TAGS环境变量触发,deploy.yml 在发布"提升已测试镜像"时使用):由于镜像从未在本地构建,docker tag无法表达 registry 到 registry 的复制,且docker pull只能带回单架构镜像,因此改用docker buildx imagetools create在manifest index 层面完成多架构标签复制(脚本头注释 L18-L30 对此有详细说明)。同时可通过PROMOTE_GHCR_NAMESPACE在同一调用中镜像到 GHCR。
六、镜像底层:Firefox 与 GeckoDriver 如何进入镜像
标签体系背后,是 NodeFirefox/Dockerfile 的构建逻辑:
Firefox 安装(L21-L70):通过FIREFOX_VERSION、FIREFOX_DOWNLOAD_URL、FIREFOX_LANG_VERSION三个构建参数控制。当版本为latest/beta-latest/nightly-latest/devedition-latest/esr-latest或 amd64 架构时走 install-firefox-apt.sh(配置 Mozilla 官方 apt 源并校验签名指纹35BAA0B33E9EB396F59CA838C0BA5CE6DC6315A3,设置Pin-Priority: 1000优先安装);其他固定版本则通过 install-firefox-package.sh 从 Mozilla CDN 下载.deb或.tar.bz2包安装。安装后执行apt-get upgrade修复 Firefox 依赖链的潜在 CVE,并清理 apt 缓存。
GeckoDriver 安装(L75-L86):默认取 GitHub releases 的latest版本,按架构下载linux64或linux-aarch64包,解压到/opt/geckodriver-$GK_VERSION并符号链接到/usr/bin/geckodriver。这就是打标脚本能在容器内执行geckodriver --version探测版本的前提。
浏览器信息归档(L93-L96):构建时把浏览器名称、版本写入/opt/selenium/browsers/firefox/,并生成包含moz:firefoxOptions.binary的binary_location文件,供 Grid 节点自动发现浏览器能力。
最终,Standalone/Dockerfile 以node-firefox为基础镜像(--build-arg BASE=node-firefox),在同一个镜像文件系统上叠加 Selenium Server 与 VNC/noVNC 等组件,因此node-firefox与standalone-firefox共享同一套浏览器/驱动版本信息——这就是同一批标签能同时打到两个镜像上的根本原因。
七、实战:如何选择和使用这些标签
文档所属的版本矩阵(CHANGELOG/README.md)提醒用户:并非每个 Grid 与浏览器版本的组合都经过完整测试,用户需根据自身测试需求自行评估。选择标签时参考 docs/docker-hub/node-firefox.md 的 Tagging Conventions:
- 开发/快速验证:使用
latest,如selenium/node-firefox:latest; - 锁定浏览器主版本:使用短版本,如
selenium/node-firefox:116.0(本发布中即116.0-20250202); - 精确定位发布:使用全版本组合,如
selenium/node-firefox:116.0.3-geckodriver-0.35.0-grid-4.28.1-20250202,可同时锁定浏览器、驱动与 Grid 三者版本; - 固定到某个构建日期:使用含
-YYYYMMDD后缀的标签。
启动 Node 模式(以本文 4.28.1 的 Firefox 116 镜像为例):
docker network create grid docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.28.1-20250202 docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ --shm-size="2g" \ selenium/node-firefox:116.0.3-geckodriver-0.35.0-grid-4.28.1-20250202注意:浏览器类镜像运行时需使用--shm-size="2g"挂载足够的主机共享内存,避免浏览器进程因/dev/shm不足而崩溃。测试完成后可用docker network rm grid清理网络。
八、总结
firefox_116.md虽是一份发布日志,却完整呈现了 docker-selenium 浏览器镜像标签体系的三个核心设计:镜像内版本自检保证标签与产物一致;长短双版本号在精确性与可读性之间取得平衡;RELEASE_OLD_VERSION参数避免历史发布覆盖新版本的滚动标签。理解这条打标流水线,无论是选择固定版本镜像做回归测试,还是复现历史发布组合,都能做到有的放矢。相关实现可继续在 tag_and_push_browser_images.sh、Makefile、NodeFirefox/Dockerfile 与 CHANGELOG/README.md 中深入研读。
- 测试
- 后端
- 云原生
- 容器编排
- 可观测性
【免费下载链接】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
相关推荐
Selenium Docker 镜像 Chrome 102 版本发布全解析:tag_and_push_browser_images.sh 镜像标签机制深度解读
Selenium Docker 镜像 Chrome 102 版本发布全解析:tag_and_push_browser_images.sh 镜像标签机制深度解读
测试后端云原生容器编排可观测性docker-selenium 4.28.1 归档版 Firefox 131 镜像标签全解析:tag_and_push_browser_images.sh 的版本矩阵与发布机制
docker selenium 4.28.1 归档版 Firefox 131 镜像标签全解析:tag_and_push_browser_images.sh 的版
测试后端云原生容器编排可观测性Selenium Grid 4.48.0 Chrome 118 镜像标签解析:从 tag_and_push_browser_images.sh 看版本固化与多标签发布机制
Selenium Grid 4.48.0 Chrome 118 镜像标签解析:从 tag_and_push_browser_images.sh 看版本固化与多标
测试后端云原生容器编排可观测性
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考