我可以在 docker 构建期间使用 RUN --mount=type=bind 保留纱线安装缓存吗?

Gia*_*ini 13 docker dockerfile yarnpkg google-cloud-build docker-buildkit

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

我考虑过两种选择:

  1. RUN --mount=type=bind
  2. RUN --mount=type=cache

下面描述为什么这两种方法都不起作用。

(1) 运行 --mount=type=bind

(简化的)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
Run Code Online (Sandbox Code Playgroud)

.yarn/cache不幸的是,命令结束后目录中不存在任何数据docker build

rw选项文档中描述了没有保留数据的原因:Allow writes on the mount. Written data will be discarded。如果写入的数据被丢弃,那么第一次生成缓存的工作方式是什么?

(2)RUN --mount=type=cache

或者我考虑使用RUN --mount=type=cache. 不幸的是,似乎没有一种简单的方法可以将缓存保留在构建主机的本地目录中,以便轻松保存到 Amazon S3 或 GCS 存储桶中。如果缓存未持久化,并且 Docker 守护进程状态未在不同的云构建之间共享,我们就无法在不同的云构建之间使用它。

换句话说:在不同docker build计算机上运行的不同计算机之间共享缓存目录而不在映像中包含此缓存的最佳方法是什么?我在这里失踪还有其他方式吗?

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

Cha*_*tos 0

如果您使用默认的基本节点图像,例如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
Run Code Online (Sandbox Code Playgroud)