【问题标题】:Set expiration or max-age limit for docker build --cache-from with BuildKit使用 BuildKit 为 docker build --cache-from 设置过期或最大年龄限制
【发布时间】: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 的结构,通常是这样的

  1. 拉语言运行时
  2. 更新语言包管理器
  3. 安装系统要求(很少更新)
  4. 复制依赖固定并安装(每周更新)
  5. 复制应用程序源(很少缓存,但可能缓存在微服务 monorepos 中,或者如果开发仅影响构建上下文之外的文件,例如 CI 文件)
  6. 使用 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


    【解决方案1】:

    我认为可能的解决方法是将时间戳写入 CI 系统缓存的任意文件中,并将其用作 FROM 指令之前的构建参数作为“缓存时期”,以有效地使整个 docker 映像失效的任意文件被修改。

    # Dockerfile
    
    ARG CACHE_EPOCH
    
    FROM <some-language>
    
    # ...
    
    # bitbucket-pipelines.yml
    definitions:
      caches:
        epoch: ~/cache-epoch.txt
    
    pipelines:
      default:
        - step:
            caches:
              - epoch
            script:
              - touch ~/cache-epoch.txt
              - docker build . --build-arg CACHE_EPOCH=$(<~/cache-epoch.txt)
              - date > ~/cache-epoch.txt
    

    但这感觉很麻烦,我希望有一个 BuildKit 内置机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2015-09-10
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多