如何为容器内运行的作业缓存容器镜像
GitHub Actions 缓存容器镜像加速作业运行
方法一:用actions/cache缓存Docker镜像层
GitHub Actions默认会尝试缓存Docker镜像,但手动配置actions/cache可以更稳定地复用镜像层。通过缓存Docker的存储目录,让后续作业直接复用已下载的镜像:
jobs: build: runs-on: ubuntu-latest steps: - name: 缓存Docker镜像层 uses: actions/cache@v3 with: path: /var/lib/docker key: docker-texlive-${{ hashFiles('**/Dockerfile') }} restore-keys: docker-texlive- - name: 在容器内执行作业 uses: docker://texlive/texlive:latest with: entrypoint: /bin/bash args: -c "你的具体作业命令"
path指定Docker存储镜像层的目录(Ubuntu Runner默认是/var/lib/docker)key结合镜像相关文件的哈希值,确保镜像更新时生成新缓存restore-keys用于匹配前缀缓存,当精确key不存在时复用旧缓存
方法二:托管自定义镜像到GitHub Packages
如果官方镜像体积大,可先拉取官方镜像做自定义调整,推送到GitHub Packages后,作业直接拉取该镜像——GitHub Actions拉取同平台的Packages镜像速度更快:
jobs: build: runs-on: ubuntu-latest container: image: ghcr.io/你的GitHub用户名/texlive-custom:latest credentials: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}
需要提前完成:
- 本地基于
texlive/texlive:latest构建自定义镜像 - 推送镜像到自己的GitHub Packages仓库
方法三:用Docker Buildx缓存构建层(自定义镜像场景)
如果需要自行构建镜像,用Docker Buildx将构建层缓存到GitHub Actions缓存中,避免重复构建:
jobs: build: runs-on: ubuntu-latest steps: - name: 初始化Docker Buildx uses: docker/setup-buildx-action@v2 - name: 缓存Buildx构建层 uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: buildx-texlive-${{ github.sha }} restore-keys: buildx-texlive- - name: 构建并加载镜像 uses: docker/build-push-action@v4 with: context: . push: false load: true tags: texlive-custom:latest cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache,mode=max - name: 在容器内执行作业 run: docker run texlive-custom:latest 你的作业命令
注意事项
- 不同系统的Runner,Docker存储目录不同:Windows Runner是
C:\ProgramData\Docker,Mac Runner是/Users/runner/.docker - 缓存key要根据镜像内容调整,比如镜像依赖文件更新时,哈希值变化会触发新缓存生成
- 使用GitHub Packages时,确保
GITHUB_TOKEN拥有读取Packages仓库的权限
内容的提问来源于stack exchange,提问作者Sujal Singh
相关产品推荐
相关产品推荐

