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

如何为GitHub actions-runner-controller运行器缓存镜像下载?

解决ARC临时运行器容器化作业镜像重复下载问题

针对你遇到的Actions Runner Controller(ARC)临时运行器每次都需要重新拉取容器镜像的问题,以下是几个可行的解决方案,结合你的Flux配置给出具体调整方式:


方案1:为每个DIND容器配置独立持久化缓存卷(避免状态冲突)

直接共享/var/lib/docker会导致Pod崩溃后残留异常状态,改为给每个DIND容器分配专属的持久化缓存卷,同时配置Docker自动清理策略:

修改arc-runner-set的HelmRelease配置:

values:
  # 启用StatefulSet,让每个Pod绑定专属PVC
  statefulSet: true
  minRunners: 4
  maxRunners: 4
  # ... 其他原有配置
  template:
    spec:
      # 定义PVC模板,动态为每个Pod分配缓存卷
      volumeClaimTemplates:
        - metadata:
            name: dind-cache
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 50Gi # 根据业务需求调整存储大小
            storageClassName: "your-storage-class" # 替换为你的集群存储类
      containers:
        - name: dind
          # ... 原有配置
          args:
            - dockerd
            - --host=unix:///var/run/docker.sock
            - --group=$(DOCKER_GROUP_GID)
            - --storage-opt=dm.basesize=40G # 限制镜像存储上限
            - --log-driver=json-file
            - --log-opt=max-size=10m
            - --log-opt=max-file=3
            - --cleanup # 启动时自动清理无用镜像
            - --prune-filters="until=24h" # 清理24小时前的旧镜像
          volumeMounts:
            # ... 原有volumeMounts
            - name: dind-cache
              mountPath: /var/lib/docker # 挂载专属缓存卷到Docker数据目录

方案2:预拉常用镜像到自定义DIND镜像

将工作流中频繁使用的基础镜像提前打包到自定义DIND镜像中,避免每次启动都从远程仓库拉取:

  1. 编写自定义DIND镜像的Dockerfile:
FROM docker:dind

# 预拉取工作流常用镜像,按需添加
RUN docker pull ubuntu:22.04 && \
    docker pull node:20-alpine && \
    docker pull python:3.11-slim

ENTRYPOINT ["dockerd-entrypoint.sh"]
  1. 构建并推送到你的私有镜像仓库:
docker build -t docker-registry:5000/custom-dind:latest .
docker push docker-registry:5000/custom-dind:latest
  1. 修改arc-runner-set的配置,替换DIND镜像:
values:
  # ... 其他原有配置
  template:
    spec:
      containers:
        - name: dind
          image: docker-registry:5000/custom-dind:latest # 使用自定义预拉镜像
          # ... 其他配置不变

方案3:调整Runner复用策略,减少Pod重建

你设置了固定数量的运行器但仍频繁重建,大概率是ARC默认标记工作流结束后的Runner为"脏"并自动销毁。调整复用策略保留Runner:

修改arc-runner-set的配置:

values:
  # ... 其他原有配置
  disableRunnerReuse: false # 启用Runner复用
  maxRunnerReuseCount: 5 # 每个Runner最多复用5次,避免长期运行状态污染
  runnerIdleTimeout: "30m" # 空闲30分钟后才销毁Runner

方案4:使用Docker BuildKit远程缓存(针对镜像构建场景)

如果工作流包含Docker镜像构建步骤,可配置BuildKit远程缓存到私有仓库,即使DIND容器重建,也能从远程缓存拉取构建层:

在工作流的构建步骤中添加缓存配置:

- name: Build Docker image
  run: |
    docker build . \
      --tag my-image:latest \
      --cache-from=type=registry,ref=docker-registry:5000/my-image:cache \
      --cache-to=type=registry,ref=docker-registry:5000/my-image:cache,mode=max

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:50:09