news 2026/10/4 1:51:13

docker-selenium 浏览器镜像 Tag 发布记录解读:以 Chrome 128 为例的标签命名规范与发布脚本全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
docker-selenium 浏览器镜像 Tag 发布记录解读:以 Chrome 128 为例的标签命名规范与发布脚本全解析
  • 测试
  • 后端
  • 云原生
  • 容器编排
  • 可观测性

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

本文围绕 CHANGELOG/archived/4.28.1/chrome_128.md 这份发布记录展开,它完整记录了 docker-selenium 项目在 Selenium Grid 4.28.1 版本中为 Chrome 128.0.6613.137 镜像生成并打上全部标签的过程。通过对照根目录下的 tag_and_push_browser_images.sh 发布脚本源码,读者可以彻底理解:一套标签的命名构成规则、脚本参数的含义与默认值、短版本号的计算逻辑,以及如何在 CI(Makefile)中触发这套发布流程,最终在自己的测试环境中精准选择、拉取并验证对应版本的 Chrome 节点镜像。

发布记录里发生了什么

chrome_128.md是一份由发布脚本直接生成的执行日志,记录了为 Chrome 128 镜像打标签并推送(push)的完整过程。日志开头的命令说明了本次发布的核心参数:

./tag_and_push_browser_images.sh 4.28.1 20250202 selenium false chrome true

随后脚本依次输出了本次发布涉及的关键版本信息:

  • Selenium Grid 版本:4.28.1-20250202(Grid 版本号与构建日期的组合,即脚本中的TAG_VERSION)
  • Chrome 版本:128.0.6613.137
  • Short Chrome 版本(短版本):128.0
  • ChromeDriver 版本:128.0.6613.137
  • Short ChromeDriver 版本(短版本):128.0

这里可以看到一个值得注意的事实:Chrome 与 ChromeDriver 在该次发布中版本号完全一致(128.0.6613.137),这正是 Chrome for Testing(CfT)模式出现后 Chrome 与驱动版本严格对齐的典型表现。

12 个标签的完整清单与命名拆解

发布脚本为node-chrome与standalone-chrome两个镜像各打上了 6 个标签,合计 12 个。原始记录如下:

Tagged selenium/node-chrome:128.0.6613.137-chromedriver-128.0.6613.137-grid-4.28.1-20250202 Tagged selenium/standalone-chrome:128.0.6613.137-chromedriver-128.0.6613.137-grid-4.28.1-20250202 Tagged selenium/node-chrome:128.0.6613.137-chromedriver-128.0.6613.137-20250202 Tagged selenium/standalone-chrome:128.0.6613.137-chromedriver-128.0.6613.137-20250202 Tagged selenium/node-chrome:128.0.6613.137-20250202 Tagged selenium/standalone-chrome:128.0.6613.137-20250202 Tagged selenium/node-chrome:128.0-chromedriver-128.0-grid-4.28.1-20250202 Tagged selenium/standalone-chrome:128.0-chromedriver-128.0-grid-4.28.1-20250202 Tagged selenium/node-chrome:128.0-chromedriver-128.0-20250202 Tagged selenium/standalone-chrome:128.0-chromedriver-128.0-20250202 Tagged selenium/node-chrome:128.0-20250202 Tagged selenium/standalone-chrome:128.0-20250202

逐项拆解这 6 种标签后缀,其语义分别是:

标签后缀示例语义
128.0.6613.137-chromedriver-128.0.6613.137-grid-4.28.1-20250202完整浏览器版本 + 完整驱动版本 + 完整 Grid 版本 + 构建日期
128.0.6613.137-chromedriver-128.0.6613.137-20250202完整浏览器版本 + 完整驱动版本 + 构建日期
128.0.6613.137-20250202完整浏览器版本 + 构建日期
128.0-chromedriver-128.0-grid-4.28.1-20250202短浏览器版本 + 短驱动版本 + 完整 Grid 版本 + 构建日期
128.0-chromedriver-128.0-20250202短浏览器版本 + 短驱动版本 + 构建日期
128.0-20250202短浏览器版本 + 构建日期

每一类标签都同时打在node-chrome和standalone-chrome两个镜像上,因为浏览器节点(Node)与独立(Standalone)形态共享同一套浏览器与驱动的组合,区别只在于前者需配合 Hub 组成 Grid,后者自带 Grid 服务。

这套标签命名结构在 docs/docker-hub/node-chrome.md 中有官方化的描述,其通用模板为:

selenium/node-chrome-<browserVersion>-<browserDriver>-<browserDriverVersion>-<Major>.<Minor>.<Patch>-<YYYYMMDD>

以及简化形态:

selenium/node-chrome-<Major>.<Minor>.<Patch>-<YYYYMMDD>

标签从何而来:脚本源码中的生成逻辑

这 12 个标签并不是手工拼写的,而是 tag_and_push_browser_images.sh 在chrome分支中自动生成的。脚本首先通过docker run临时启动刚刚构建好的node-chrome:4.28.1-20250202镜像,从容器内部探测真实的浏览器与驱动版本:

CHROME_VERSION=$(docker run --platform ${PLATFORM} --rm ${NAMESPACE}/node-chrome:${TAG_VERSION} google-chrome --version | awk '{print $3}') CHROMEDRIVER_VERSION=$(docker run --platform ${PLATFORM} --rm ${NAMESPACE}/node-chrome:${TAG_VERSION} chromedriver --version | awk '{print $2}')

这两条命令分别从容器内的google-chrome --version与chromedriver --version输出中提取版本字段,保证标签与镜像内实际安装的二进制版本严格一致,而不是依赖构建参数中声明的版本号。随后脚本根据浏览器/驱动版本构造标签数组(见 tag_and_push_browser_images.sh),并循环调用retag函数为node-chrome与standalone-chrome同时打标签:

for chrome_tag in "${CHROME_TAGS[@]}"; do retag node-chrome "${chrome_tag}" retag standalone-chrome "${chrome_tag}" done

从源码结构看,脚本的其他分支(chromium、edge、firefox、chrome-for-testing)遵循完全相同的模式,只是探测命令与驱动名不同,例如 Edge 用microsoft-edge --version/msedgedriver --version,Firefox 用firefox --version/geckodriver --version。

短版本号的由来:short_version 函数

日志中 Chrome 与 ChromeDriver 都输出了"Short 版本"128.0,这一简化版本由脚本中的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]}" }

其逻辑是把完整版本号按.拆分成数组,只取前两个数字(主版本与次版本)拼接。128.0.6613.137因此得到128.0。短版本标签的价值在于:它提供了一个不随补丁版本变化的稳定入口,当 Chrome 从128.0.6613.137升级到128.0.6613.140这类同主次版本的补丁发布时,selenium/node-chrome:128.0-20250202这类标签无需改写即可滚动指向新的构建,方便团队在测试配置中维持一个较长周期的稳定引用。

脚本的七个参数与默认行为

发布日志开头的命令是理解整个记录的关键,其参数映射如下(对应 tag_and_push_browser_images.sh 的位置参数解析):

位置命令中的值参数含义
$14.28.1VERSIONSelenium Grid 版本号
$220250202BUILD_DATE镜像构建日期(YYYYMMDD)
$3seleniumNAMESPACEDocker Hub 命名空间
$4falsePUSH_IMAGE是否在打标签后执行docker push,默认false
$5chromeBROWSER目标浏览器(chrome / chromium / edge / firefox / chrome-for-testing)
$6trueRELEASE_OLD_VERSION是否为旧版本补发标签,默认false
$7(未传)PLATFORM探测版本时使用的平台,默认linux/amd64

其中RELEASE_OLD_VERSION参数直接决定了本日志中标签清单的长度。看脚本源码,当该值为false(即常规发布)时,标签数组会额外追加 4 个不带构建日期的"纯版本"标签(见 tag_and_push_browser_images.sh):

${CHROME_VERSION}-chromedriver-${CHROMEDRIVER_VERSION} ${CHROME_VERSION} ${CHROME_SHORT_VERSION}-chromedriver-${CHROMEDRIVER_SHORT_VERSION} ${CHROME_SHORT_VERSION}

而本次记录中RELEASE_OLD_VERSION=true,意味着这是一次对已归档旧版本的补发/补标操作,因此不带构建日期的通用标签被跳过(避免覆盖当前仍在滚动更新的latest语义标签),只保留了带构建日期的 6 个标签,这正是日志中恰好出现 12 条 Tagged 输出的原因。

retag 与推送:打标签与推送的实际动作

日志中每条Tagged输出都来自retag()函数(见 tag_and_push_browser_images.sh)。默认路径下它的核心动作是:

docker tag "${__source}" "${NAMESPACE}/${__image}:${__tag}" echo "Tagged ${NAMESPACE}/${__image}:${__tag}" if [ "${PUSH_IMAGE}" = true ]; then docker push "${NAMESPACE}/${__image}:${__tag}" fi

即先基于已构建的selenium/node-chrome:4.28.1-20250202源镜像执行docker tag生成别名标签,再根据PUSH_IMAGE决定是否执行docker push推送。本记录中PUSH_IMAGE=false,所以日志只停留在Tagged阶段——这也解释了记录里没有出现 push 相关输出。

源码中还保留了PROMOTE_TAGS与PROMOTE_GHCR_NAMESPACE两个环境变量分支(由发布工作流deploy.yml设置):当发布直接复用已测试通过的镜像而非重新构建时,retag()会改用docker buildx imagetools create在 registry 之间复制 manifest index,从而保住多架构镜像特性,并可同步镜像到 GHCR 命名空间。这属于从源码注释与分支结构可以推断的发布机制细节,普通手工发布并不涉及。

在 Makefile 与 CI 中的触发方式

这套打标签流程在项目中由 Makefile 统一编排:

tag_and_push_browser_images: tag_and_push_chrome_images tag_and_push_chrome-for-testing_images tag_and_push_chromium_images tag_and_push_firefox_images tag_and_push_edge_images tag_and_push_chrome_images: ./tag_and_push_browser_images.sh $(VERSION) $(BUILD_DATE) $(NAMESPACE) $(PUSH_IMAGE) chrome $(RELEASE_OLD_VERSION)

其中$(VERSION)、$(BUILD_DATE)、$(NAMESPACE)、$(PUSH_IMAGE)、$(RELEASE_OLD_VERSION)均由 Makefile 变量注入,Makefile的.PHONY列表中也将tag_and_push_browser_images声明为伪目标。tag_and_push_browser_images_ghcr目标则对应上文提到的 GHCR 镜像镜像流程:通过docker images枚举本地标签后,逐一用docker buildx imagetools create打到$(GHCR_NAMESPACE)命名空间下。

发布记录的来源与版本矩阵定位

本记录存放于 CHANGELOG/README.md 定义的"浏览器版本矩阵"体系中。该 README 明确指出矩阵的目的:在持续供给最新 Selenium Grid 核心版本的同时,允许用户固定(pin)某个浏览器版本进行跨浏览器测试,或规避特定浏览器版本的已知问题。矩阵表格中,4.28.1行的 Chrome 128 列即链接到本文分析的chrome_128.md;同目录下的chrome_127.md、chrome_126.md等文件结构与本文完全一致,只是浏览器版本号不同。

同时矩阵 README 也给出了重要免责声明:项目并未对"每个 Grid 版本 × 浏览器版本"的组合都做全量测试,用户需要依据自身测试需求自行评估组合可用性。

如何用这套标签拉取并验证镜像

理解了标签命名后,实际使用就非常直观。例如在 README.md 描述的 Hub + Node 模式下固定 Chrome 128 与 Grid 4.28.1:

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-chrome:128.0.6613.137-chromedriver-128.0.6613.137-grid-4.28.1-20250202

若希望团队配置在补丁升级时保持稳定,可选用短版本标签,例如selenium/node-chrome:128.0-20250202。拉取后可通过与发布脚本相同的方式核对镜像内真实版本:

docker run --rm selenium/node-chrome:128.0-20250202 google-chrome --version docker run --rm selenium/node-chrome:128.0-20250202 chromedriver --version

对照 CHANGELOG/archived/4.28.1/chrome_128.md 中的128.0.6613.137,即可验证镜像内容与发布记录一致。README 同时提醒:运行含浏览器的镜像务必携带--shm-size="2g"使用宿主机共享内存,避免 Chrome 在容器内因/dev/shm过小而崩溃。

版本来源的底层支撑:NodeChrome 镜像构建

标签中的版本号最终来源于 NodeChrome/Dockerfile 构建的镜像本身。该 Dockerfile 通过ARG CHROME_VERSION="google-chrome-stable"指定 Chrome 安装通道(stable/beta/unstable),并依次执行 NodeChrome/install-chrome.sh、NodeChrome/install-chromedriver.sh 完成浏览器与驱动的安装;构建末尾还会把google-chrome --version解析出的版本写入/opt/selenium/browsers/chrome/version供 Grid 节点上报能力。install-chromedriver.sh中针对 Chrome 128 这类 115 以后的版本走 Chrome for Testing(CfT)下载源,amd64 架构从chrome-for-testing-public存储桶获取与 Chrome 同版本号的驱动,这也是日志中两者版本号一致的根本原因。

小结

chrome_128.md虽是一份简短的脚本输出,但它是理解 docker-selenium 镜像发布与标签体系的理想样本:一次命令、两次版本探测、12 个标签,背后是脚本中参数化、短版本化、按RELEASE_OLD_VERSION裁剪标签数组、retag统一执行打标/推送的一套成熟设计。结合 tag_and_push_browser_images.sh 与 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

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

相关推荐

上一篇:Dependency Injector多容器管理:复杂应用架构设计指南
下一篇:DBeaver驱动包终极指南:一站式解决30+数据库连接烦恼

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

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

SVPWM工程实践:PI双闭环解耦下的调制链路优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 1:49:41

Linux内核reset通用框架:功耗子系统中的确定性复位保障

1. 项目概述&#xff1a;为什么“reset通用框架”是功耗子系统里最常被忽略的硬骨头在Linux内核开发圈里&#xff0c;一提到功耗子系统&#xff08;PM subsystem&#xff09;&#xff0c;大家本能想到的是cpuidle、cpufreq、runtime PM这些高频词——它们出现在面试题里、写在驱…

作者头像 李华
网站建设 2026/10/4 1:48:23

AI-Native IP研发流程:从Spec到RTL的自动化实践与避坑指南

1. 从一份规格书到能跑通的电路&#xff0c;中间到底隔着什么做数字芯片这行的朋友大概都有体会&#xff1a;拿到一份 IP 规格书&#xff08;Spec&#xff09;的那一刻&#xff0c;心里是清楚的——功能、接口、时序、寄存器映射&#xff0c;白纸黑字写得明明白白。但从这份 Sp…

作者头像 李华
网站建设 2026/10/4 1:48:16

【电机驱动】使用Jetson Orin NX实现与电机的通信

一开始计划打算直接使用Jetson ORIN NX上的CAN实现与电机的通信&#xff0c;但是在调试的过程中发现ORIN上的CAN使用会存在问题。为了加速开发&#xff0c;后面使用了一块STM32H7的板子实现电机数据的收发&#xff0c;再通过串口与ORIN实现通信。CAN通讯实现&#xff08;失败&a…

作者头像 李华
网站建设 2026/10/4 1:47:31

U9客开中UI插件开发过程中碰到有一个坑

U9系统太大了&#xff0c;不可避免会发生一些隐含的重大BUG。今天碰到一个这样的问题&#xff0c;在请购单列表上做了一个【模拟提交】的按钮&#xff0c;目的是取代原来的【提交】按钮&#xff0c;目的是可以加上个性化需要的防呆措施&#xff0c;实现客制化的目的。效果如下图…

作者头像 李华