我可以在构建Docker的过程中使用RUN --mount=type=bind来保持Yarn安装缓存吗?

gojuced7  于 2023-01-16  发布在  Docker
关注(0)|答案(1)|浏览(157)

在使用Docker BuildKit构建Docker映像时,我尝试生成并重用yarn install缓存。Yarn缓存保存在.yarn/cache目录中,不应包含在最终映像中(.yarn/cache相对于生成上下文根)。.yarn/cache目录应在多个构建版本之间共享,以便始终从热缓存启动并具有快速yarn install命令(即使由于package.json中的更改而导致缓存未命中)。如果我们可以在docker build结束后访问.yarn/cache内容,将很容易在多个构建之间共享,例如将其上传到Amazon S3或GCS存储桶。
我考虑了两个选择:

  1. RUN --mount=type=bind
  2. 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之间共享缓存目录的最佳方法是什么,而不将此缓存包含在映像中?还有其他方法我遗漏了吗?

  1. RUN --mount=type=bind:允许将目录挂接为本地目录,但实际上不允许写入该目录,因此我无法在第一次运行时生成该高速缓存。
  2. RUN --mount=type=cache:允许在同一台机器上的多个构建之间共享该高速缓存,但如果我们运行多个不同的docker build(在不同的机器上),这将不会有帮助,因为缓存总是空的。
bqujaahr

bqujaahr1#

如果您使用默认的基本节点映像,例如node:16,您可以通过执行以下操作来完成所需的操作:

FROM node:16
WORKDIR /app
COPY package.json .
COPY yarn.lock .
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
    yarn install --frozen-lockfile --ignore-scripts --production
COPY . .
RUN yarn build

相关问题