如何在`docker buildx`中使用Pulled Image作为缓存

ezykj2lf  于 2023-10-16  发布在  Docker
关注(0)|答案(2)|浏览(120)

我们正在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"

我们如何修改docker buildx build以使用拉取的映像作为缓存,确保在命令保持不变的情况下不会执行每个RUN
这是我们的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 && [...]
7lrncoxx

7lrncoxx1#

使用docker buildx构建时使用--cache-from选项

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

通过指定此选项,Docker将重用从Dockerfile中初始步骤未更改且层相同的拉取映像中的层。

bfnvny8b

bfnvny8b2#

要在Docker Buildx中使用拉取的镜像作为缓存,您可以在docker buildx build命令中使用--build-arg BUILDKIT_INLINE_CACHE=1参数。这将启用BuildKit内联缓存,并允许将拉取的映像用作后续构建的缓存。
以下是如何修改docker buildx build命令以使用拉取的镜像作为缓存:

docker buildx build . \
  --tag "ghcr.io/foo/bar/baz" \
  --build-arg BUILDKIT_INLINE_CACHE=1 \
  --cache-from "type=registry,ref=ghcr.io/foo/bar/baz" \
  --cache-to "type=registry,ref=ghcr.io/foo/bar/baz" \  # optional
  --push

以下是对其他选项的解释:

  • --build-arg BUILDKIT_INLINE_CACHE=1:这将启用BuildKit的内联缓存。
  • --cache-from“type=registry,ref= ghcr.io/foo/bar/baz“:指定用作缓存的图像。在本例中,它使用从ghcr.io/foo/bar/baz中提取的图像。
  • --cache-to“type=registry,ref=ghcr.io/foo/bar/baz”:这指定了存储该高速缓存的位置。它与您正在构建的映像具有相同的注册表和引用。这使您可以在后续生成中重用该高速缓存。

通过这些修改,Docker Buildx将尝试在构建过程中使用拉取的映像作为缓存,确保如果命令保持不变,则不会执行每个RUN步骤。如果该高速缓存可用,并且Dockerfile中的命令没有更改,Docker将重用缓存的层,这可以显著加快CI构建。

相关问题