使用 --cache-from 和 --cache-to 管理构建缓存
在本步骤中,你将学习如何使用 --cache-from 和 --cache-to 标志管理 Docker 构建缓存。构建缓存可以通过复用之前构建的层来显著加速后续构建。--cache-from 允许你指定一个镜像作为缓存源,而 --cache-to 则允许你将构建缓存导出到指定位置(如注册表或本地目录)。
首先,确保你位于 ~/project 目录下。
cd ~/project
让我们稍微修改 Dockerfile 来模拟通常会破坏缓存的更改。我们将添加一个简单的 RUN 指令。
使用 nano 打开 Dockerfile:
nano Dockerfile
在 builder 阶段的 ARG 指令后添加以下行:
RUN echo "Adding a new layer"
更新后的 Dockerfile 应如下所示:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
保存 Dockerfile 并退出 nano。
现在,让我们不使用任何特定缓存选项再次构建镜像。Docker 会自动使用本地缓存(如果可用)。
docker build -t my-cached-image .
你应该会看到某些层是从头开始构建的,因为我们添加了新指令,使后续指令的缓存失效。
现在,让我们模拟一个场景:你可能希望使用之前构建的镜像作为缓存源,可能来自注册表或其他构建。出于演示目的,我们将使用刚刚构建的 my-cached-image 作为新构建的缓存源。
首先,让我们再次对 Dockerfile 做一个小改动来模拟另一个修改。
打开 Dockerfile:
nano Dockerfile
更改新 RUN 指令中的消息:
RUN echo "Adding another new layer"
更新后的 Dockerfile 应如下所示:
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
保存并退出 nano。
现在再次构建镜像,但这次使用 --cache-from 标志指定 my-cached-image 作为缓存源。
docker build --cache-from my-cached-image -t my-cached-image-from .
你应该会观察到 Docker 尝试使用来自 my-cached-image 的层。第一个 RUN 指令对应的层可能会因为指令更改而重新构建,但如果匹配,后续层可能会从缓存中拉取。
--cache-to 标志用于导出构建缓存。这在 CI/CD 流水线中特别有用,可以在构建之间共享缓存。要使用 --cache-to,通常需要使用支持缓存导出的构建驱动,例如 docker-container 驱动。
首先,让我们安装 Docker Compose,它通常与 buildx 一起使用。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
现在,让我们创建一个 buildx 构建器实例。
docker buildx create --use
现在,让我们构建镜像并将缓存导出到本地目录。我们将使用 local 缓存导出器。
docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
docker buildx build:使用 buildx 工具进行构建
--cache-to type=local,dest=./build-cache:将缓存导出到当前目录下名为 build-cache 的本地目录
-t my-exported-cache-image:为生成的镜像打标签
.:指定构建上下文(当前目录)
--load:将构建的镜像加载到本地 Docker 镜像缓存中
你应该会看到指示构建和缓存导出的输出。~/project 目录下将创建一个 build-cache 目录。
现在,让我们模拟一个干净的构建环境,并尝试使用导出的缓存进行构建。首先,让我们删除我们构建的镜像。
docker rmi my-cached-image my-cached-image-from my-exported-cache-image
现在再次构建镜像,这次使用导出的缓存作为源。
docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
--cache-from type=local,src=./build-cache:从本地目录 build-cache 导入缓存
你应该会观察到 Docker 使用了来自导出缓存的层,与从头开始构建相比,显著加快了构建过程。