如何解决Docker 中 Yarn 的只读缓存
我想为在我的 CI 服务器上构建的项目创建一个全局 Yarn 缓存。我的项目是 dockerized,我创建了一个夜间作业来填充这个缓存。将其视为具有 package.json
的项目,其中包含来自所有项目的所有依赖项。当这项工作完成后,缓存会被填充,我希望我的日常工作使用这个缓存。
但是,有时这些依赖项的更新之前没有缓存。因此,Yarn 尝试写入缓存目录。但是,由于 this issue 以及在多个写入者的情况下缓存损坏,我不想让我每天的 yarn install
写入这个预先填充的缓存。
我目前在我的 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 层缓存是无用的,并且导致构建需要几分钟时间来更新单个千字节依赖项。
解决方法
就像问题所说的,yarn install 有一个 --mutex
option 来防止并发构建。但由于这是一个 BuildKit 缓存,您可以改为使用 sharing=locked
来一次只让一个 yarn 访问缓存:
RUN --mount=type=cache,sharing=locked,target=/usr/local/share/.cache/yarn yarn install
如果您需要单独的缓存,您可以指定 id=
而不是更改 target
。 target
默认用作缓存 id
,但通过自己指定 id
,您可以在不同的目标或具有不同缓存的同一目标上使用相同的缓存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。