You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins中利用Podman Agent构建缓存优化镜像构建?

问题场景

我使用Jenkins 2.387.2通过Jenkins Helm Chart构建镜像,在values.yaml中配置了Podman Agent用于镜像构建,配置如下:

...
  podman:
    podName: podman
    customJenkinsLabels: podman
    image: podman-agent
    tag: 0.1
    alwaysPullImage: false #true
    volumeMounts:
    - mountPath: "/home/jenkins/agent"
      name: "workspace-volume"
      readOnly: false
    workingDir: "/home/jenkins/agent"

当前每个Jenkins流水线都会创建新的Podman Agent执行构建步骤,我希望通过构建缓存缩短构建时间,目前采用拉取历史镜像并使用--cache-from参数的方式:

docker build -t ${repository}:${env.BUILD_NUMBER} -f ./Dockerfile --cache-from ${repository}:latest .

请问是否有办法将之前Agent的构建缓存复用至当前Agent中?

可行解决方案

要实现不同Podman Agent之间的构建缓存复用,核心是把Podman的构建缓存目录挂载到持久化存储上,让所有Agent共享这一缓存目录,具体步骤如下:

1. 修改Helm Chart的values.yaml配置,添加持久化缓存卷

在Podman Agent的配置块中,新增缓存目录的挂载配置,并定义对应的持久化卷(推荐用PVC,在K8S集群中更稳定):

...
  podman:
    podName: podman
    customJenkinsLabels: podman
    image: podman-agent
    tag: 0.1
    alwaysPullImage: false #true
    volumeMounts:
    - mountPath: "/home/jenkins/agent"
      name: "workspace-volume"
      readOnly: false
    # 新增构建缓存挂载
    - mountPath: "/var/lib/containers"
      name: "podman-build-cache"
      readOnly: false
    workingDir: "/home/jenkins/agent"
    # 定义持久化卷
    volumes:
    - name: "podman-build-cache"
      persistentVolumeClaim:
        claimName: "jenkins-podman-cache-pvc"

如果集群中还没有对应的PVC,先创建一个:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-podman-cache-pvc
  namespace: <你的Jenkins命名空间>
spec:
  accessModes:
    - ReadWriteMany # 支持多Pod同时读写,适配多个Agent共享缓存
  resources:
    requests:
      storage: 50Gi # 根据实际缓存需求调整存储大小

2. 调整构建命令,启用本地共享缓存

修改流水线中的构建命令,让Podman直接使用共享缓存目录中的本地缓存(可保留--cache-from作为补充策略):

podman build -t ${repository}:${env.BUILD_NUMBER} -f ./Dockerfile .

Podman默认将构建缓存存储在/var/lib/containers/storage下,当该目录被持久化共享后,新启动的Agent可以直接读取之前Agent留下的缓存层。

3. 可选:优化缓存管理

  • 定期清理旧缓存:在流水线中添加步骤执行podman system prune -f,避免缓存体积过大(注意选择合适的时机执行,避免清理正在使用的缓存)。
  • 分支隔离缓存:多分支流水线场景下,可给每个分支分配独立的缓存子目录,比如挂载/var/lib/containers/${BRANCH_NAME},避免分支间缓存干扰。

内容的提问来源于stack exchange,提问作者Reda E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:12:40