ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Apache Groovy Docker 官方镜像完全指南:标签体系、容器化运行与镜像变体选择

Apache Groovy Docker 官方镜像完全指南:标签体系、容器化运行与镜像变体选择
  • 文档

【免费下载链接】docs

Documentation for Docker Official Images in docker-library

项目地址:https://gitcode.com/gh_mirrors/docs/docs
点击查看免费下载

导读

本文以 Docker Official Images 文档仓库中 groovy/README.md 为骨架,系统讲解 Apache Groovy 官方镜像的标签命名与别名语义、多版本/JDK/基础发行版矩阵、容器内运行 Groovy 脚本与 Groovysh REPL 的实操命令,以及alpine变体与默认 Ubuntu 变体的取舍。读完本文,你将能按需选择正确的镜像标签、用一条docker run命令在容器中执行 Groovy 脚本,并掌握 Grapes 依赖缓存跨容器复用的标准做法。

什么是 Apache Groovy

Apache Groovy 是为 Java 平台设计的强大编程语言:它既是可选类型(optionally typed)的动态语言,又具备静态类型与静态编译(static-typing and static compilation)能力。其设计目标是凭借简洁、熟悉、易于学习的语法提升开发者生产力,并且能与任何 Java 程序无缝集成,开箱即用地为应用带来脚本执行、DSL(领域特定语言)编写、运行时与编译期元编程、函数式编程等能力。

在官方镜像体系中,该镜像由 Apache Groovy 项目官方维护(对应维护者声明见 groovy/maintainer.md),其镜像仓库归类于 Docker Hub 的languages-and-frameworks分类(见 groovy/metadata.json)。README 中关于镜像与使用的正文内容,实际来自生成源文件 groovy/content.md,经由 update.sh 等模板工具自动渲染而成(详见文末"文档维护机制"一节)。

镜像标签体系详解

标签命名规则与别名机制

官方镜像通过"标签组"的方式为同一份构建产物提供多个别名,Groovy 镜像的标签遵循统一语义:

  • 版本前缀:6.0.0/6.0/6分别表示完整版本、次要版本与主版本别名,拉取时三者指向同一份镜像;
  • JDK 限定:-jdk21、-jdk17、-jdk25、-jdk11、-jdk8指定镜像内置的 JDK 大版本;不写 JDK 的裸标签(如6.0.0)等价于该版本线的默认 JDK 版本;
  • 发行版后缀:-noble(Ubuntu 24.04)与-jammy(Ubuntu 22.04)是 Ubuntu 发行版的 suite 代号,-alpine表示基于 Alpine Linux 的镜像变体;
  • 全局最短别名:latest、jdk、jdk8、jdk11、jdk17、jdk21、jdk25、noble、jammy、alpine等"裸别名"分别指向当前活跃维护的某个具体标签组(详见下方各版本标签清单及别名归属表)。

每个标签组都对应上游 docker-groovy 构建仓库(其地址记录于 groovy/github-repo)中的一份Dockerfile,目录结构形如groovy-6/jdk21/Dockerfile、groovy-5/jdk21-alpine/Dockerfile。

Groovy 6.0.0 标签

Groovy 6 系列全部基于 Ubuntu noble(24.04),提供 jdk21 / jdk17 / jdk25 三组 JDK 及各自的 alpine 变体,其中jdk21 组承载了该版本线及镜像仓库中绝大部分全局别名(含jdk、6、noble、alpine):

  • jdk21(Ubuntu noble):6.0.0-jdk21、6.0-jdk21、6-jdk21、jdk21、6.0.0-jdk21-noble、6.0-jdk21-noble、6-jdk21-noble、jdk21-noble、6.0.0-jdk、6.0-jdk、6-jdk、jdk、6.0.0、6.0、6、6.0.0-jdk-noble、6.0-jdk-noble、6-jdk-noble、jdk-noble、6.0.0-noble、6.0-noble、6-noble、noble
  • jdk21-alpine:6.0.0-jdk21-alpine、6.0-jdk21-alpine、6-jdk21-alpine、jdk21-alpine、6.0.0-jdk-alpine、6.0-jdk-alpine、6-jdk-alpine、jdk-alpine、6.0.0-alpine、6.0-alpine、6-alpine、alpine
  • jdk17(Ubuntu noble):6.0.0-jdk17、6.0-jdk17、6-jdk17、jdk17、6.0.0-jdk17-noble、6.0-jdk17-noble、6-jdk17-noble、jdk17-noble
  • jdk17-alpine:6.0.0-jdk17-alpine、6.0-jdk17-alpine、6-jdk17-alpine、jdk17-alpine
  • jdk25(Ubuntu noble):6.0.0-jdk25、6.0-jdk25、6-jdk25、jdk25、6.0.0-jdk25-noble、6.0-jdk25-noble、6-jdk25-noble、jdk25-noble
  • jdk25-alpine:6.0.0-jdk25-alpine、6.0-jdk25-alpine、6-jdk25-alpine、jdk25-alpine

Groovy 5.1.3 标签

Groovy 5 系列横跨 Ubuntu noble 与 jammy 两代基础镜像,并提供 jdk21 / jdk17 / jdk11 / jdk25 四组 JDK;其中jdk21(noble)组承载了latest与5、5.1等主要别名,而jdk11 组基于 Ubuntu jammy(22.04)并承载了jammy全局别名:

  • jdk21(Ubuntu noble):5.1.3-jdk21、5.1-jdk21、5-jdk21、5.1.3-jdk21-noble、5.1-jdk21-noble、5-jdk21-noble、latest、5.1.3-jdk、5.1-jdk、5-jdk、5.1.3、5.1、5、5.1.3-jdk-noble、5.1-jdk-noble、5-jdk-noble、5.1.3-noble、5.1-noble、5-noble
  • jdk21-alpine:5.1.3-jdk21-alpine、5.1-jdk21-alpine、5-jdk21-alpine、5.1.3-jdk-alpine、5.1-jdk-alpine、5-jdk-alpine、5.1.3-alpine、5.1-alpine、5-alpine
  • jdk17(Ubuntu noble):5.1.3-jdk17、5.1-jdk17、5-jdk17、5.1.3-jdk17-noble、5.1-jdk17-noble、5-jdk17-noble
  • jdk17-alpine:5.1.3-jdk17-alpine、5.1-jdk17-alpine、5-jdk17-alpine
  • jdk11(Ubuntu jammy):5.1.3-jdk11、5.1-jdk11、5-jdk11、jdk11、5.1.3-jdk11-jammy、5.1-jdk11-jammy、5-jdk11-jammy、jdk11-jammy、5.1.3-jdk-jammy、5.1-jdk-jammy、5-jdk-jammy、jdk-jammy、5.1.3-jammy、5.1-jammy、5-jammy、jammy
  • jdk11-alpine:5.1.3-jdk11-alpine、5.1-jdk11-alpine、5-jdk11-alpine、jdk11-alpine
  • jdk25(Ubuntu noble):5.1.3-jdk25、5.1-jdk25、5-jdk25、5.1.3-jdk25-noble、5.1-jdk25-noble、5-jdk25-noble
  • jdk25-alpine:5.1.3-jdk25-alpine、5.1-jdk25-alpine、5-jdk25-alpine

Groovy 4.0.33 标签

Groovy 4 系列同样覆盖 noble 与 jammy 两代基础镜像,提供 jdk21 / jdk17 / jdk11 / jdk8 / jdk25 五组 JDK,是当前唯一仍提供 jdk8 标签的版本线(jdk8 组基于 Ubuntu jammy,并承载jdk8全局别名):

  • jdk21(Ubuntu noble):4.0.33-jdk21、4.0-jdk21、4-jdk21、4.0.33-jdk21-noble、4.0-jdk21-noble、4-jdk21-noble、4.0.33-jdk、4.0-jdk、4-jdk、4.0.33、4.0、4、4.0.33-jdk-noble、4.0-jdk-noble、4-jdk-noble、4.0.33-noble、4.0-noble、4-noble
  • jdk21-alpine:4.0.33-jdk21-alpine、4.0-jdk21-alpine、4-jdk21-alpine、4.0.33-jdk-alpine、4.0-jdk-alpine、4-jdk-alpine、4.0.33-alpine、4.0-alpine、4-alpine
  • jdk17(Ubuntu noble):4.0.33-jdk17、4.0-jdk17、4-jdk17、4.0.33-jdk17-noble、4.0-jdk17-noble、4-jdk17-noble
  • jdk17-alpine:4.0.33-jdk17-alpine、4.0-jdk17-alpine、4-jdk17-alpine
  • jdk11(Ubuntu jammy):4.0.33-jdk11、4.0-jdk11、4-jdk11、4.0.33-jdk11-jammy、4.0-jdk11-jammy、4-jdk11-jammy、4.0.33-jdk-jammy、4.0-jdk-jammy、4-jdk-jammy、4.0.33-jammy、4.0-jammy、4-jammy
  • jdk11-alpine:4.0.33-jdk11-alpine、4.0-jdk11-alpine、4-jdk11-alpine
  • jdk8(Ubuntu jammy):4.0.33-jdk8、4.0-jdk8、4-jdk8、jdk8、4.0.33-jdk8-jammy、4.0-jdk8-jammy、4-jdk8-jammy、jdk8-jammy
  • jdk8-alpine:4.0.33-jdk8-alpine、4.0-jdk8-alpine、4-jdk8-alpine、jdk8-alpine
  • jdk25(Ubuntu noble):4.0.33-jdk25、4.0-jdk25、4-jdk25、4.0.33-jdk25-noble、4.0-jdk25-noble、4-jdk25-noble
  • jdk25-alpine:4.0.33-jdk25-alpine、4.0-jdk25-alpine、4-jdk25-alpine

Groovy 3.0.25 标签

Groovy 3 系列的结构与 4 系列一致,覆盖 noble / jammy 与 jdk21 / jdk17 / jdk11 / jdk8 / jdk25 五组 JDK:

  • jdk21(Ubuntu noble):3.0.25-jdk21、3.0-jdk21、3-jdk21、3.0.25-jdk21-noble、3.0-jdk21-noble、3-jdk21-noble、3.0.25-jdk、3.0-jdk、3-jdk、3.0.25、3.0、3、3.0.25-jdk-noble、3.0-jdk-noble、3-jdk-noble、3.0.25-noble、3.0-noble、3-noble
  • jdk21-alpine:3.0.25-jdk21-alpine、3.0-jdk21-alpine、3-jdk21-alpine、3.0.25-jdk-alpine、3.0-jdk-alpine、3-jdk-alpine、3.0.25-alpine、3.0-alpine、3-alpine
  • jdk17(Ubuntu noble):3.0.25-jdk17、3.0-jdk17、3-jdk17、3.0.25-jdk17-noble、3.0-jdk17-noble、3-jdk17-noble
  • jdk17-alpine:3.0.25-jdk17-alpine、3.0-jdk17-alpine、3-jdk17-alpine
  • jdk11(Ubuntu jammy):3.0.25-jdk11、3.0-jdk11、3-jdk11、3.0.25-jdk11-jammy、3.0-jdk11-jammy、3-jdk11-jammy、3.0.25-jdk-jammy、3.0-jdk-jammy、3-jdk-jammy、3.0.25-jammy、3.0-jammy、3-jammy
  • jdk11-alpine:3.0.25-jdk11-alpine、3.0-jdk11-alpine、3-jdk11-alpine
  • jdk8(Ubuntu jammy):3.0.25-jdk8、3.0-jdk8、3-jdk8、3.0.25-jdk8-jammy、3.0-jdk8-jammy、3-jdk8-jammy
  • jdk8-alpine:3.0.25-jdk8-alpine、3.0-jdk8-alpine、3-jdk8-alpine
  • jdk25(Ubuntu noble):3.0.25-jdk25、3.0-jdk25、3-jdk25、3.0.25-jdk25-noble、3.0-jdk25-noble、3-jdk25-noble
  • jdk25-alpine:3.0.25-jdk25-alpine、3.0-jdk25-alpine、3-jdk25-alpine

全局别名归属速查

下表汇总了不带版本号的"全局别名"实际指向的标签组,便于快速决策:

全局别名指向的标签组基础发行版内置 JDK
latest5.1.3-jdk21Ubuntu nobleJDK 21
jdk6.0.0-jdk21Ubuntu nobleJDK 21
jdk216.0.0-jdk21Ubuntu nobleJDK 21
jdk176.0.0-jdk17Ubuntu nobleJDK 17
jdk256.0.0-jdk25Ubuntu nobleJDK 25
jdk115.1.3-jdk11Ubuntu jammyJDK 11
jdk84.0.33-jdk8Ubuntu jammyJDK 8
noble6.0.0-jdk21Ubuntu nobleJDK 21
jammy5.1.3-jdk11Ubuntu jammyJDK 11
alpine6.0.0-jdk21-alpineAlpine LinuxJDK 21

支持的架构与镜像维护信息

该官方镜像为多架构构建,官方文档列出的受支持架构包括:amd64、arm32v7、arm64v8、ppc64le、riscv64、s390x。在 ARM(树莓派、Apple Silicon)或 IBM Power / Z 等平台上部署时,Docker 会自动拉取对应架构的镜像层。

在维护与获取帮助层面,官方文档明确:镜像由 Apache Groovy 项目维护;问题与 Pull Request 应提交至 docker-groovy 仓库的 Issues 区;社区求助渠道包括 Docker Community Slack、Server Fault、Unix & Linux 与 Stack Overflow 等平台;镜像的更新动态通过 official-images 仓库中library/groovy标签与清单文件跟踪,镜像元数据与传输体积等细节可查阅 repo-info 仓库的repos/groovy/目录。

快速上手:容器内运行 Groovy

前提说明:挂载卷与用户 UID

官方文档特别提示:如果挂载了数据卷,且运行 Docker 的进程 UID 不是1000,应使用-u root以 root 用户运行容器。这是因为镜像内的默认用户以 UID 1000 设计,挂载的本地目录若归属其他 UID,容器内默认用户将没有读写权限;此时显式指定-u root可规避权限问题。

启动 Groovysh 交互式 REPL

Groovysh 是 Groovy 自带的交互式命令行环境(REPL),适合快速验证语法与 API。直接运行:

docker run -it --rm groovy
  • -it:分配交互式终端,进入 Groovysh 提示符;
  • --rm:容器退出后自动删除,适合一次性使用;
  • 不带标签时默认拉取latest(即5.1.3-jdk21)。

运行一个 Groovy 脚本

将宿主机当前目录挂载为容器内脚本目录并作为工作目录,然后执行脚本及参数:

docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts groovy groovy <script> <script-args>

参数拆解:

参数含义
-v "$PWD":/home/groovy/scripts将当前目录挂载到容器内固定脚本路径/home/groovy/scripts
-w /home/groovy/scripts将工作目录切换为挂载点,使脚本中的相对路径引用与宿主机一致
第一个groovy镜像名
第二个groovy镜像内的groovy启动器命令
<script> <script-args>脚本文件名及传给脚本的命令行参数

例如,若宿主机当前目录下有hello.groovy,执行docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts groovy groovy hello.groovy即可运行它。容器是"一次性"的:代码通过卷挂载注入,容器本身不保留任何业务状态。

复用 Grapes 依赖缓存

Grapes 是 Groovy 内建的依赖管理机制,配合@Grab注解即可在脚本中按需声明第三方库(Grape 会自动解析并缓存依赖)。每次启动新容器时若重复下载依赖既慢又浪费带宽,官方推荐通过具名数据卷将本地 Grapes 缓存持久化并跨容器复用:

docker volume create --name grapes-cache docker run --rm -it -v grapes-cache:/home/groovy/.groovy/grapes groovy

第一条命令创建名为grapes-cache的数据卷;第二条命令将其挂载到容器内固定路径/home/groovy/.groovy/grapes。此后任何容器共享该卷,@Grab下载过的依赖会直接命中缓存,不会因容器销毁而丢失。

镜像变体(Image Variants)详解

官方镜像按使用场景提供两类基础变体,标签后缀即为判别依据。

groovy:<version>:默认变体(Ubuntu 基础)

这是最通用的"事实标准"镜像,适合绝大多数场景:既可当作一次性容器(挂载源码后直接启动应用),也可作为二次构建其他镜像的基础镜像。该变体基于 Ubuntu,部分标签带有jammy或noble后缀——它们是 Ubuntu 发行版的 suite 代号,明确标识镜像所基于的 Ubuntu 具体版本。

选用建议:如果镜像内需要额外安装 Ubuntu 软件包(如通过apt-get安装系统工具),建议显式指定带jammy/noble后缀的标签。这样当 Ubuntu 发布新版本、基础镜像随之滚动升级时,你的镜像不会因基础发行版悄然更换而意外破坏构建。

groovy:<version>-alpine:Alpine 变体(极致瘦身)

该变体基于流行的 Alpine Linux(其基础镜像本身仅约 5MB),在"镜像体积尽可能小"为第一优先级时是最佳选择。但需注意其关键差异:Alpine 使用musl libc而非 glibc 及其衍生实现,因此对 libc 依赖较深或有特定假设的软件,在 Alpine 上可能遇到兼容性问题——选择前应充分评估项目对标准 C 库的依赖深度。

同时,为了把体积压到最小,Alpine 变体通常不预装git、bash等附加工具。若需要在其中使用这些工具,应在自己的 Dockerfile 中基于该镜像自行添加所需软件包(可参考 alpine 官方镜像文档中的包安装示例)。

许可证说明

镜像内的主软件(Apache Groovy)采用 Apache License 2.0 开源许可(声明见 groovy/license.md)。与所有 Docker 镜像类似,镜像中还可能包含其他软件(如基础发行版自带的 Bash 等),它们各自适用不同的许可证;镜像的使用者有责任确认对镜像内全部软件的使用符合其各自许可证的要求。部分可由工具自动探测到的额外许可信息,可在 repo-info 仓库的groovy/目录中查阅。

文档维护机制(仓库视角)

本文依据的 README 并非手写文档,而是由本仓库模板系统自动生成的:真正的正文内容维护在 groovy/content.md("什么是 Groovy"与"如何使用"两节),update.sh 会读取content.md、github-repo、maintainer.md、license.md、metadata.json等组成文件,结合模板与 official-images 的标签清单渲染出最终 groovy/README.md。因此在仓库中修改镜像文档的正确姿势是编辑content.md而非README.md,格式合规性由 markdownfmt.sh 在 CI 中校验(仓库总览见 README.md)。这一机制也解释了为何 README 顶部的标签与架构信息会随镜像发布自动保持同步。

  • 文档

【免费下载链接】docs

Documentation for Docker Official Images in docker-library

项目地址:https://gitcode.com/gh_mirrors/docs/docs
点击查看免费下载
上一篇:H2 Database Web Console 未授权 JDBC 攻击 RCE 深度解析(CVE-2022-23221)与 Vulhub 环境复现
下一篇:Cua Driver 与 Lume 的持久化发布渠道选择机制:RFC 3101 设计与实现全解析

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进