【发布时间】:2023-12-23 00:10:02
【问题描述】:
我想为在我的 CI 服务器上构建的项目创建一个全局 Yarn 缓存。我的项目是 dockerized,我创建了一个夜间作业来填充这个缓存。把它想象成一个带有package.json 的项目,其中包含来自所有项目的所有依赖项。当这项工作完成后,缓存被填充,我希望这个缓存被我的日常工作使用。
但是,有时这些依赖项的更新之前没有缓存。因此,Yarn 尝试写入缓存目录。但是,由于this issue 和多个写入者的缓存损坏,我不想让我的日常yarn installs 写入这个预先填充的缓存。
我目前在我的 Dockerfiles 中有这个(使用 BuildKit):
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn/v6,ro yarn install
如果我删除 ro(只读),我可能会遇到一个损坏的缓存目录。如果我保留它,我的yarn install 在需要更新其缓存时可能会失败并出现类似以下错误:
verbose 1.426 Error: EROFS: read-only file system, mkdir '/usr/local/share/.cache/yarn/v6/npm-bluebird-3.7.2-9f229c15be272454ffa973ace0dbee79a1b0c36f'
如果我将--cache-folder 设置为填充缓存以外的某个位置,则不会消耗任何缓存。
有没有办法以这种方式缓存包?当 package.json 文件更新时,Docker 层缓存是无用的,并且会导致构建需要几分钟才能更新单个多千字节依赖项。
【问题讨论】: