【发布时间】:2022-07-15 19:47:19
【问题描述】:
TL;DR:如果我的 CI docker build 指令类似于
DOCKER_BUILDKIT=1 docker build \
--cache-from registry.my.org/project-x/app:latest \
--tag registry.my.org/project-x/app:latest \
--tag registry.my.org/project-x/app:$CI_BUILD_NUM \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg BUILD_NUM=$CI_BUILD_NUM \
.
如何限制可接受的图像缓存的过期或最长期限,以便每周左右刷新第一个 FROM <some-language>:latest dockerfile 指令,从而触发完整构建?
上下文:我的 CI 缓存系统 Bitbucket Pipelines 不会缓存使用 BuildKit 生成的 docker 层,我计划在公司范围内启用它以进行各种改进。建议的解决方法是在构建时使用--build-arg BUILDKIT_INLINE_CACHE=1 和--cache-from 选项以从以前发布的图像中受益。见https://support.atlassian.com/bitbucket-cloud/docs/run-docker-commands-in-bitbucket-pipelines/#Docker-BuildKit-caching-limitations
这太棒了,因为我可以避免缓存大小限制,这会导致大型项目中频繁的层缓存未命中。
但是
由于我的 dockerfiles 的结构,通常是这样的
- 拉语言运行时
- 更新语言包管理器
- 安装系统要求(很少更新)
- 复制依赖固定并安装(每周更新)
- 复制应用程序源(很少缓存,但可能缓存在微服务 monorepos 中,或者如果开发仅影响构建上下文之外的文件,例如 CI 文件)
- 使用 CI 增量运行号枚举版本(从不缓存,但超级便宜!)
(有关 Python 项目,请参阅此示例,但 Node 或 Php 项目的编写方式非常相似)
FROM python:3.9-slim
RUN pip install --upgrade pip
RUN apt-get update && apt-get install --assume-yes \
gcc gettext libcurl4-openssl-dev libpangoft2-1.0-0 libssl-dev ... whatever
WORKDIR /app
COPY requirements.txt /app
RUN pip install --requirement requirements.txt
COPY . /app
ARG BUILD_NUM
RUN test -n "$BUILD_NUM"
ENV RELEASE_NUM=$BUILD_NUM
CMD ["python", "/app/main.py"]
我担心在涉及运行时、包管理器和系统库安装的序言中,我将永远有一个完美的缓存命中,随着时间的推移将它们拖到旧版本上。
现在 docker 层缓存每周都会清除一次,因此图像最终会保持最新!
【问题讨论】:
标签: docker caching continuous-integration bitbucket-pipelines docker-buildkit