在使用Docker BuildKit构建Docker映像时,我尝试生成并重用yarn install
缓存。Yarn缓存保存在.yarn/cache
目录中,不应包含在最终映像中(.yarn/cache
相对于生成上下文根)。.yarn/cache
目录应在多个构建版本之间共享,以便始终从热缓存启动并具有快速yarn install
命令(即使由于package.json
中的更改而导致缓存未命中)。如果我们可以在docker build
结束后访问.yarn/cache
内容,将很容易在多个构建之间共享,例如将其上传到Amazon S3或GCS存储桶。
我考虑了两个选择:
RUN --mount=type=bind
RUN --mount=type=cache
下面介绍两种方法中的任何一种不起作用的原因。
(1)运行--装载=类型=绑定
(简化的)Dockerfile如下所示:
ENV YARN_CACHE_FOLDER ".yarn/cache"
COPY package.json yarn.lock ./
RUN --mount=type=bind,source=.yarn/cache,target=.yarn/cache,rw yarn install --frozen-lockfile
不幸的是,docker build
命令结束后,.yarn/cache
目录中不存在任何数据。rw
选项documentation中描述了不保留数据的原因:Allow writes on the mount. Written data will be discarded
。如果写入的数据被丢弃,第一次生成该高速缓存的工作方法是什么?
(2)× 1米14英寸1x
另外我考虑使用RUN --mount=type=cache
。不幸的是,似乎没有一种简单的方法可以该高速缓存持久化在构建主机的本地目录中,以便轻松地保存到Amazon S3或GCS存储桶中。如果缓存没有持久化,我们就不能在不同的云构建之间使用它,如果它们之间没有共享Docker守护进程状态。
换句话说:在不同机器上运行的不同docker build
之间共享缓存目录的最佳方法是什么,而不将此缓存包含在映像中?还有其他方法我遗漏了吗?
RUN --mount=type=bind
:允许将目录挂接为本地目录,但实际上不允许写入该目录,因此我无法在第一次运行时生成该高速缓存。RUN --mount=type=cache
:允许在同一台机器上的多个构建之间共享该高速缓存,但如果我们运行多个不同的docker build
(在不同的机器上),这将不会有帮助,因为缓存总是空的。
1条答案
按热度按时间bqujaahr1#
如果您使用默认的基本节点映像,例如
node:16
,您可以通过执行以下操作来完成所需的操作: