我正在使用多阶段构建,其中两个阶段都安装 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)
现在,我看到了三种可能的方法来解决这个问题,但不知道如何实现其中任何一个(即无需黑客):
--mount
的选项,这可以让我指定。建议或其他建议将不胜感激。
这是一个最小的 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
将内容从一个阶段复制到另一阶段怎么样?
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/
的目标?