使用缓存的多阶段(并行)构建上的 APT 锁争用

问题描述 投票:0回答:1

我正在使用多阶段构建,其中两个阶段都安装 APT 软件包(下面的 MWE Dockerfile)。我在

--mount=type=cache
上使用
/var/cache/apt
以避免在两个阶段重新下载软件包。缓存目录在各个阶段之间共享,这本身很好,但是:当它们并行运行时,其中一个将失败:

43.24 E: Could not get lock /var/cache/apt/archives/lock. It is held by process 0
43.24 E: Unable to lock directory /var/cache/apt/archives/

-o DPkg::Lock::Timeout=180
选项没有帮助,那是针对 dpkg,而不是 APT)

现在,我看到了三种可能的方法来解决这个问题,但不知道如何实现其中任何一个(即无需黑客):

  1. 让APT等待锁被释放;有这样的选择吗?我无法回避任何事情。
  2. 使每个阶段的缓存分开;我不介意,因为安装的包通常是不同的(构建与运行时),但没有看到
    --mount
    的选项,这可以让我指定。
  3. 使构建串行运行;我真的不介意,这不是问题。但同样,找不到任何 buildkit 强制执行的选项。

建议或其他建议将不胜感激。


这是一个最小的 Dockerfile,您可以自己尝试一下;它没有做任何有用的事情,但应该会触发问题。

FROM debian:bookworm-20230919 as builder
RUN rm -f /etc/apt/apt.conf.d/docker-clean
RUN --mount=type=cache,target=/var/cache/apt apt update && apt -y --no-install-recommends install build-essential
# build stuff, result in /tmp/build


FROM debian:bookworm-20230919 as production
RUN rm -f /etc/apt/apt.conf.d/docker-clean
RUN --mount=type=cache,target=/var/cache/apt apt update && apt -y --no-install-recommends install vim
# install stuff via --mount=target=/build,from=builder,source=/tmp/build
docker caching apt contention buildkit
1个回答
0
投票

将内容从一个阶段复制到另一阶段怎么样?

FROM debian:bookworm-20230919 as builder

RUN rm -f /etc/apt/apt.conf.d/docker-clean
RUN apt update && apt -y --no-install-recommends install build-essential

FROM debian:bookworm-20230919 as production

COPY --from=builder /var/cache/apt/ /var/cache/apt/
COPY --from=builder /var/lib/apt/lists/ /var/lib/apt/lists/

RUN apt -y --no-install-recommends install vim

这将强制各个阶段连续构建,但你说你对此没意见。

通过跨缓存和包列表进行复制,您无需在

apt update
阶段运行
production
。我假设这是阶段之间缓存
/var/cache/apt/
的目标?

© www.soinside.com 2019 - 2024. All rights reserved.