如何在GitHub Action中实现npm依赖缓存(不缓存Docker镜像)
实现方案
你可以通过BuildKit的缓存挂载能力实现仅缓存npm依赖、不缓存整个Docker镜像的需求,具体操作如下:
方案:BuildKit缓存挂载(推荐,无镜像缓存)
这个方案只会缓存npm下载的依赖包,不会存储任何Docker镜像层,完全符合你的要求。
第一步:修改Dockerfile
调整npm ci指令,加入BuildKit专属的缓存挂载声明,挂载的内容不会写入镜像层:
FROM node WORKDIR /app ADD package*.json ./ # 新增--mount参数,将npm缓存目录挂载到宿主机临时缓存区 RUN --mount=type=cache,target=/root/.npm npm ci ENV PATH /app/node_modules/.bin:$PATH
注:
/root/.npm是官方node镜像的默认npm缓存路径,如果你使用非root用户运行容器,需要修改为对应用户的npm缓存路径。
第二步:修改GitHub Actions配置
新增缓存步骤存储npm依赖包,同时保留原有构建逻辑:
name: NPM build on: push: branches: - main jobs: build-npm-image: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # 缓存npm依赖包 - name: Cache npm dependencies uses: actions/cache@v4 with: path: /tmp/.buildkit-cache key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-npm- - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and Tag Node image id: build-ui-image run: | docker buildx build \ --cache-from type=local,src=/tmp/.buildkit-cache \ --cache-to type=local,dest=/tmp/.buildkit-cache \ --no-cache \ # 新增这个参数即可完全禁用Docker镜像层缓存,只保留npm依赖缓存 -t ui \ -f ./ui/Dockerfile \ .
配置中的--no-cache参数会强制所有镜像层重新构建,只有npm ci步骤会复用缓存的依赖包,跳过下载环节,构建速度和缓存镜像层的方案基本一致。
内容的提问来源于stack exchange,提问作者gamechanger17
相关产品推荐
相关产品推荐

