Docker中Yarn的只读缓存



我想为在CI服务器上构建的项目创建一个全局Yarn缓存。我的项目是固定化的,我创建了一个夜间作业来填充这个缓存。把它想象成一个package.json包含所有项目的所有依赖项的项目。完成此作业后,将填充缓存,我希望此缓存可供我的日常作业使用。

但是,有时会对这些依赖项进行更新,这些更新以前没有缓存。因此,Yarn尝试写入缓存目录。但是,由于这个问题以及在多个写入程序的情况下缓存损坏,我不想让我每天的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安装有一个--mutex选项来防止并发构建。但由于这是一个BuildKit缓存,因此您可以使用sharing=locked一次只允许一个线程访问该缓存:

RUN --mount=type=cache,sharing=locked,target=/usr/local/share/.cache/yarn yarn install

如果需要单独的缓存,可以指定id=,而不是更改target。默认情况下,target用作缓存id,但通过自己指定id,您可以在不同的目标上使用相同的缓存,也可以在具有不同缓存的同一目标上使用。

最新更新