构建镜像时的缓存控制与密钥管理
在本步骤中,你将学习如何控制 Docker 构建缓存,以及如何使用 BuildKit 的 secret
挂载类型在构建过程中安全处理密钥。构建缓存能显著加快构建速度,但有时需要禁用缓存。安全处理密钥对于避免将敏感信息嵌入镜像层至关重要。
首先,确保你位于 ~/project
目录:
cd ~/project
让我们修改 Dockerfile
,添加需要控制缓存的步骤并演示密钥处理。我们将增加一个创建文件的简单步骤和一个假设需要使用密钥的步骤。
打开 Dockerfile
进行编辑:
nano Dockerfile
修改内容以包含创建带时间戳文件的 RUN
指令和密钥使用的占位符:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## 这是使用密钥的命令占位符
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]
我们添加了 RUN echo "Build time: $(date)" > /app/build_info.txt
。该命令创建了包含该层构建时间戳的 /app/build_info.txt
文件。默认情况下,Docker 会缓存各层。如果你在不修改该 RUN
指令前内容的情况下多次构建镜像,该层可能会从缓存中读取,时间戳也不会更新。
按 Ctrl + X
,然后按 Y
和 Enter
保存修改后的 Dockerfile
。
现在,让我们用新标签 my-cached-image
构建镜像:
docker build -t my-cached-image .
观察输出。如果你最近构建过该镜像,可能会看到某些步骤显示 ---> Using cache
。
为了演示缓存控制,让我们再次构建镜像,但这次使用 --no-cache
标志完全禁用缓存:
docker build --no-cache -t my-no-cache-image .
你将看到 Docker 会重建每一层,即使指令没有改变。这在需要确保获取最新依赖项或之前构建因缓存损坏而失败时非常有用。
现在让我们讨论密钥处理。被注释掉的 ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
行展示了如何使用 BuildKit 处理密钥。要使用此功能,你需要启用 BuildKit(新版本 Docker 通常默认启用),并在构建时使用 --secret
标志提供密钥。
例如,如果你有一个包含密钥的 mysecret.txt
文件,构建命令如下(由于我们没有 mysecret.txt
文件且该行被注释,此命令不会实际执行,仅展示语法):
## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .
RUN --mount=type=secret,id=mysecret
指令仅在构建步骤期间将密钥内容提供到 /run/secrets/mysecret
。密钥不会包含在最终镜像层中。这是处理 API 密钥或密码等敏感信息的正确方式。
由于我们没有密钥文件且相关行已被注释,我们不会执行涉及密钥的构建命令。但理解 --no-cache
和 secret
挂载类型的概念对于控制构建过程和处理敏感数据非常重要。