- 运维
- 任务调度
- 后端
【免费下载链接】rundeck
Enable Self-Service Operations: Give specific users access to your existing tools, services, and scripts
本指南以 Rundeck 仓库中docker/yuminstall-centos7目录为核心,讲解如何在 CentOS 7 容器环境中通过yum安装本地构建的 Rundeck RPM 包,并启动rundeckd服务完成安装验证。读者将掌握镜像构建、源码目录挂载、RPM 安装与启动验证的完整流程,可用于日常开发中对打包产物的回归测试。
方案概览与适用场景
Rundeck 的 RPM 安装验证需要与构建产物"解耦":开发者在本机构建出 RPM 后,往往希望在接近生产环境的系统(如 CentOS 7)中验证包能否正常安装、服务能否启动。docker/yuminstall-centos7提供的就是这样一套轻量验证方案:
- 使用本地构建的
.rpm文件,而不是预先打包好的镜像; - 通过
-v $PWD:/home/rundeck/rundeck把源码仓库目录挂载进容器,RPM 文件随之可见; - 容器启动时自动执行
yum install并启动rundeckd服务。
整个验证流程不依赖外网拉取制品,完全基于本地构建产物,适合 CI/CD 流水线与开发者的本地回归测试。该目录配套的基础镜像与启动脚本见 docker/centos7systemd/Dockerfile 和 docker/yuminstall-centos7/entry.sh。
工作流程总览
完整流程分为四个阶段:
- 构建 systemd 基础镜像(
docker/centos7systemd),为容器内运行rundeckd服务提供 init 环境; - 构建 yum 安装镜像(
docker/yuminstall-centos7),预装 OpenJDK、创建rundeck用户,并设置启动入口; - 以交互方式运行容器,把当前源码目录挂载到容器内
/home/rundeck/rundeck; - 容器内执行安装与启动:
yum install安装 RPM,service rundeckd start启动服务,随后进入 shell 进行手工验证。
第一步:构建 systemd 基础镜像
由于容器内需要通过service rundeckd start启动系统服务,基础镜像需要以 systemd 作为 init 进程。仓库为此提供了专用镜像定义 docker/centos7systemd/Dockerfile:
FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"]该镜像基于官方centos:7,通过清理 systemd 各 target 的默认 wants 链接来适配容器环境(容器内不需要的 udev、initctl 等服务会被移除),并挂载/sys/fs/cgroup卷,最终以/usr/sbin/init作为默认命令,从而保证容器内可以运行 systemd 管理的服务。
构建命令(在仓库根目录执行):
docker build --rm -t local/c7-systemd docker/centos7systemd--rm表示在构建成功后删除中间容器,-t local/c7-systemd为镜像指定标签,该标签会被下一步的安装镜像以FROM local/c7-systemd方式引用。
第二步:构建 yum 安装镜像
安装镜像定义位于 docker/yuminstall-centos7/Dockerfile,其核心内容如下:
FROM local/c7-systemd MAINTAINER Bill W RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm RUN yum -y update RUN yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel RUN useradd rundeck #USER rundeck ENV USERNAME=rundeck \ USER=rundeck \ HOME=/home/rundeck \ LOGNAME=$USERNAME \ TERM=xterm-256color ENV JAVA_HOME=/etc/alternatives/java_sdk ADD entry.sh /entry.sh RUN chmod +x /entry.sh VOLUME $HOME/rundeck WORKDIR $HOME/rundeck EXPOSE 4440 ENTRYPOINT ["/entry.sh"]镜像构建时依次完成以下动作:
| 步骤 | 作用 |
|---|---|
| 安装 EPEL 仓库 | 通过rpm -Uvh安装epel-release,为后续 yum 安装补充软件源 |
yum -y update | 更新系统软件包到最新版本 |
| 安装 JDK | 安装java-1.8.0-openjdk与java-1.8.0-openjdk-devel,作为 Rundeck 运行所需的 Java 运行时与开发包 |
| 创建用户 | useradd rundeck创建运行 Rundeck 的系统用户,同时通过环境变量把USERNAME、USER、HOME等统一指向rundeck//home/rundeck |
| 设置 Java 环境 | JAVA_HOME=/etc/alternatives/java_sdk指向系统 alternatives 管理的 JDK 路径 |
| 配置入口与挂载 | 将 entry.sh 拷贝到/entry.sh并赋予执行权限;声明VOLUME $HOME/rundeck(即/home/rundeck)用于挂载源码目录;WORKDIR设为/home/rundeck |
| 暴露端口 | EXPOSE 4440,即 Rundeck Web 服务默认端口 |
| 指定启动入口 | ENTRYPOINT ["/entry.sh"],容器启动时先执行安装脚本 |
构建命令:
docker build docker/yuminstall-centos7注意此命令未指定-t标签,构建完成后需要从输出中复制镜像 ID(形如53c9cb76cbe1),供下一步docker run使用。由于挂载点/home/rundeck被声明为 VOLUME,即使不显式指定-v,Docker 也会为容器创建一个匿名卷。
第三步:挂载源码目录并运行容器
在仓库根目录执行($PWD即源码根目录,$IMG为上一步复制的镜像 ID):
docker run -it -v $PWD:/home/rundeck/rundeck $IMG bash参数说明:
-it:以交互模式运行并分配伪终端,便于进入容器 shell 进行手工检查;-v $PWD:/home/rundeck/rundeck:将当前源码仓库根目录绑定挂载到容器内/home/rundeck/rundeck。这样本地构建出的 RPM 产物对容器即时可见,无需拷贝进镜像;bash:作为传给ENTRYPOINT的附加参数。容器启动时 entry.sh 会先完成安装与启动,最后通过exec "$@"以 bash 替换当前进程,让用户进入 shell。
容器启动时发生了什么
容器入口脚本 docker/yuminstall-centos7/entry.sh 的内容如下:
#!/bin/bash echo "args $*" if ! find $HOME/rundeck/packaging/rpmdist/RPMS/noarch/ -name '*.rpm' ; then echo "rpm not found at $HOME/rundeck/packaging/rpmdist/RPMS/noarch/rundeck*.rpm" exit 2 fi yum install -y $HOME/rundeck/packaging/rpmdist/RPMS/noarch/rundeck*.rpm service rundeckd start exec "$@"启动流程分为三步:
- 检查 RPM 产物是否存在:脚本会在挂载目录下的
packaging/rpmdist/RPMS/noarch/中查找*.rpm文件。这个路径对应仓库中 RPM 打包输出的目录结构——Rundeck 的 RPM 制品会输出到packaging/rpmdist/RPMS/noarch/下,包名形如rundeck*.rpm。若未找到,脚本打印错误提示并以退出码2终止; - yum 安装 RPM:
yum install -y $HOME/rundeck/packaging/rpmdist/RPMS/noarch/rundeck*.rpm一次性安装全部匹配的本地 RPM 包。由于是本地文件路径,yum 会直接解析本地依赖并安装,-y自动应答确认; - 启动服务并进入 shell:
service rundeckd start启动 Rundeck 守护进程,最后exec "$@"用用户传入的命令(此处为bash)替换当前 shell 进程,进入交互环境。
第四步:安装后的验证
容器内服务启动后,可以从以下几个方面验证安装是否成功:
- 服务状态:执行
service rundeckd status确认rundeckd处于运行状态; - 进程检查:通过
ps aux | grep rundeck查看 Rundeck 的 Java 进程是否存活; - 端口检查:Rundeck Web 默认监听
4440端口(镜像中已通过EXPOSE 4440声明),可用ss -ltn或netstat -ltn查看监听情况; - 日志检查:Rundeck 日志文件位于安装目录(RPM 安装后通常在
/var/lib/rundeck/logs),可查看启动过程是否出现异常; - RPM 包信息:执行
rpm -qa | grep rundeck确认 RPM 已正确写入系统 RPM 数据库,rpm -qi可查看包的详细信息。
与其他安装验证方案的对应关系
仓库中还提供了多套同构的安装验证方案,可相互对照理解:
- docker/rpminstall/Readme.md 及其 entry.sh:同样通过挂载源码目录验证 RPM 安装,区别在于它直接从
packaging/build/distributions目录下的 RPM 文件入手,使用rpm -ivh安装; - docker/yuminstall/Readme.md:与 CentOS 7 版流程一致,面向其他 yum 系基础镜像的验证;
- packaging/test/docker/rpminstall:仓库内置的 Docker 化 RPM 安装测试目录,配合 test/test-docker-install-rpm.sh 可一键执行"构建镜像 + 运行安装测试"的完整回归,其中
docker run -it -v "$PWD:/home/rundeck/rundeck" "$TAG":latest -test的写法与本指南的运行方式一脉相承; - packaging/lib/rpm/etc/rc.d/init.d/rundeckd:RPM 包中随附的
rundeckdinit 脚本,正是service rundeckd start实际调用的服务管理脚本;相关的安装后处理逻辑可见 packaging/lib/rpm/scripts/postinst.sh 与 packaging/lib/rpm/scripts/preinst.sh。
此外,仓库根目录的 test/test-docker-install-rpm.sh 展示了在 CI 场景中复用同一镜像进行自动化的典型模式:先docker build -t "$TAG-util"构建基础工具镜像,再构建安装镜像并以-test参数运行,将交互式验证转换为脚本化断言。
注意事项与使用限制
- 需提前构建 RPM:本方案验证的是"本地已构建的 RPM",因此运行前需先通过仓库打包流程产出 RPM 文件,并确认其位于挂载路径
packaging/rpmdist/RPMS/noarch/下(可结合 packaging 目录的打包配置确认输出位置); - 挂载路径必须一致:容器内查找 RPM 的路径固定为
/home/rundeck/rundeck/packaging/rpmdist/RPMS/noarch/,因此docker run时必须以-v $PWD:/home/rundeck/rundeck的方式挂载,且需在仓库根目录执行命令,否则 entry.sh 会因找不到 RPM 而退出; - 镜像基础为 CentOS 7 与 Java 8:基础镜像基于
centos:7,安装的是java-1.8.0-openjdk,适用于与 Rundeck 该版本打包产物对应的运行环境;若目标运行环境不同(如 RHEL 系其他版本),可参考 docker/installcommon 下多版本镜像定义进行调整; - 交互模式依赖本地 Docker 环境:
docker build与docker run需要本机已安装并可访问 Docker 守护进程,容器内服务验证依赖 systemd,因此不建议在不支持 systemd 的宿主环境中运行。
小结
docker/yuminstall-centos7为 Rundeck 提供了一条"本地构建、容器内安装"的 RPM 验证路径:以 systemd 化的 CentOS 7 镜像为底座,构建时预装 JDK 并固定入口脚本,运行时通过卷挂载让容器直接访问构建产物,entry.sh 自动完成 RPM 检查、yum 安装与服务启动。整套流程命令简单、可复现性强,既适合开发者在提交打包改动前做本地冒烟验证,也适合作为 CI 中自动化安装测试的起点。
- 运维
- 任务调度
- 后端
【免费下载链接】rundeck
Enable Self-Service Operations: Give specific users access to your existing tools, services, and scripts
相关推荐
PHPStan 错误详解:preInc.nonNumeric——对非数值类型使用前置自增运算符
PHPStan 错误详解:preInc.nonNumeric——对非数值类型使用前置自增运算符 导读 preInc.nonNumeric 是 PHPStan(P
运维任务调度后端librdkafka RPM 打包全指南:基于 Mock 与 Docker 构建和验证 Apache Kafka C 库安装包
librdkafka RPM 打包全指南:基于 Mock 与 Docker 构建和验证 Apache Kafka C 库安装包 导读 本文以 librdkafk
可观测性日志分析云原生流处理在 CentOS 上安装 Vector:YUM、RPM、Docker、脚本安装器与 Helm 完整指南
在 CentOS 上安装 Vector:YUM、RPM、Docker、脚本安装器与 Helm 完整指南 Vector 是一个高性能的可观测性数据管道(obser
可观测性数据工程数据集成日志分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考