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

如何使用docker buildx将拉取的镜像用作构建缓存

问题

我们在CI环境中构建Docker镜像,但无法让docker buildx build利用已拉取的镜像作为缓存。当前执行的Docker命令如下:

docker pull "ghcr.io/foo/bar/baz"
docker buildx build . --tag "ghcr.io/foo/bar/baz"
docker push "ghcr.io/foo/bar/baz"

对应的Dockerfile内容:

FROM amd64/alpine:3.16 as build0

RUN apk update && apk add autoconf bash [...]
FROM build0 as build1

RUN mkdir /tmp/build-deps && cd /tmp/build-deps && [...]

FROM build1 as build2
RUN cd /tmp/build-deps && wget ${patch_uri} && [...]

FROM build2 as build3
RUN mkdir /root/build-deps && [...]

FROM build3 as build4
RUN cd /tmp/build-deps/ && mkdir php-ext && cd php-ext && [...]

请问如何修改docker buildx build命令,使其使用拉取的镜像作为缓存,确保当RUN命令未变更时无需重复执行?

解决方案

要让docker buildx build复用已拉取的镜像作为缓存,需在命令中添加--cache-from参数指定缓存源,可选搭配--cache-to优化后续缓存复用,修改后的命令如下:

docker pull "ghcr.io/foo/bar/baz"
docker buildx build . \
  --tag "ghcr.io/foo/bar/baz" \
  --cache-from type=registry,ref=ghcr.io/foo/bar/baz \
  --cache-from type=local,src=/var/lib/docker \
  --cache-to type=local,dest=/var/lib/docker,mode=max
docker push "ghcr.io/foo/bar/baz"

关键参数说明

  • --cache-from type=registry,ref=ghcr.io/foo/bar/baz:直接指定拉取到本地的远程镜像作为缓存源,Docker会对比该镜像的各构建阶段(如build0、build1)与当前构建的阶段,匹配则复用缓存。
  • --cache-from type=local,src=/var/lib/docker:复用本地Docker引擎的现有缓存,适合CI环境中留存的本地构建缓存。
  • --cache-to type=local,dest=/var/lib/docker,mode=max:将本次构建的新缓存写入本地,方便后续构建复用;若需推送缓存到远程仓库,可改为--cache-to type=registry,ref=ghcr.io/foo/bar/baz:cache,mode=max(需额外推送缓存镜像)。

额外注意事项

  • 只有当Dockerfile中各构建阶段的指令完全一致时,缓存才会生效。比如RUN命令内容、${patch_uri}这类环境变量发生变化,对应阶段会重新构建。
  • 如果CI环境是临时容器(每次构建为全新环境),只需保留--cache-from type=registry,ref=ghcr.io/foo/bar/baz即可,因为本地缓存会在CI结束后销毁。
  • 若使用多平台构建,需确保拉取的镜像包含对应平台内容,或在buildx build中用--platform参数匹配拉取镜像的平台。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:04:56