可以,完全可以选择 Rocky Linux 作为基础镜像在 Jenkins 中构建。
Rocky Linux 是 CentOS 的继任者之一(由 CentOS 创始人 Gregory Kurtzer 发起),它旨在与 RHEL(Red Hat Enterprise Linux)保持二进制兼容。因此,它在企业级容器化场景中与 CentOS、AlmaLinux 非常相似,是构建 Docker/OCI 镜像的绝佳选择。
以下是关于如何在 Jenkins 中使用 Rocky Linux 构建基础镜像的关键点和注意事项:
1. 为什么选择 Rocky Linux?
- 稳定性:基于 RHEL 源码重建,拥有极高的稳定性和长期的支持周期(通常为 10 年)。
- 兼容性:如果你之前的项目是基于 CentOS 7/8 或 RHEL 开发的,迁移到 Rocky Linux 几乎不需要修改代码或构建脚本。
- 社区活跃:作为开源项目,拥有活跃的社区支持和文档。
2. 在 Jenkins 中的实现方式
你可以通过以下几种常见方式在 Jenkins Pipeline 中利用 Rocky Linux 进行构建:
A. 使用 docker build 命令 (Jenkinsfile)
这是最直接的方式。你可以在 Jenkins 的 Dockerfile 第一行指定 Rocky Linux 的官方镜像。
示例 Dockerfile:
# 选择具体的版本标签,例如 rockylinux:9 或 rockylinux:8
FROM rockylinux:9
# 安装必要的工具(如 curl, git, gcc 等)
RUN dnf install -y epel-release &&
dnf install -y git vim curl
# 设置工作目录
WORKDIR /app
# 复制应用代码
COPY . /app
# 构建或启动命令
CMD ["./start.sh"]
对应的 Jenkinsfile (Declarative Pipeline):
pipeline {
agent any
stages {
stage('Build Image') {
steps {
script {
// 确保节点上有 docker 环境
sh '''
# 登录 Docker Registry (如果需要推送到私有仓库)
docker login -u $DOCKER_USER -p $DOCKER_PASS
# 构建镜像
docker build -t my-rocky-app:latest .
# 推送镜像
docker push my-rocky-app:latest
'''
}
}
}
}
}
B. 使用 Kubernetes/Docker Agent
如果你的 Jenkins 运行在 K8s 上,你可以配置一个基于 Rocky Linux 的 Pod 作为 Agent,这样构建过程完全在 Rocky Linux 环境中执行,更加纯净。
3. 需要注意的关键点
虽然技术上完全可行,但在实际操作中需注意以下细节:
-
包管理器差异:
- Rocky Linux 使用
dnf(推荐) 或yum作为包管理器,而不是 Ubuntu/Debian 系的apt。 - 在
Dockerfile中必须使用RUN dnf install ...,且通常需要添加-y参数以自动确认安装。 - 如果依赖 EPEL 源,需要先运行
dnf install -y epel-release。
- Rocky Linux 使用
-
镜像大小:
- Rocky Linux 的基础镜像通常比 Alpine Linux 大很多,但比某些其他发行版更精简。如果追求极致的镜像体积,可以考虑基于 Rocky Linux 的多阶段构建(Multi-stage builds),将编译环境放在一个大镜像中,最终产物复制到一个小镜像中。
-
安全性更新:
- 由于 Rocky Linux 遵循 RHEL 的安全策略,定期更新基础镜像层(
dnf update -y)对于生产环境的容器安全至关重要。
- 由于 Rocky Linux 遵循 RHEL 的安全策略,定期更新基础镜像层(
-
架构支持:
- 确保你的 Jenkins 构建机器的 CPU 架构(x86_64, aarch64 等)与你要构建的目标架构一致,或者使用 QEMU 进行多架构构建(
docker buildx)。
- 确保你的 Jenkins 构建机器的 CPU 架构(x86_64, aarch64 等)与你要构建的目标架构一致,或者使用 QEMU 进行多架构构建(
总结
完全可以。Rocky Linux 是一个非常成熟、稳定且受支持的 Linux 发行版,非常适合用于生产环境的容器基础镜像构建。你只需要在 Dockerfile 中正确引用 rockylinux:<version> 标签,并适应其 dnf 包管理逻辑即可。
CLOUD云枢