繁体   English   中英

如何在 Docker 中挂载 NextJS 缓存

[英]How to mount NextJS cache in Docker

有谁知道在 Docker 中挂载 Next 缓存的方法?

我认为这会相对简单。 我发现 buildkit 有一个缓存挂载功能,并试图将它添加到我的 Dockerfile 中。

COPY --chown=node:node . /code


RUN --mount=type=cache,target=/code/.next/cache npm run build

但是我发现我无法作为节点写入缓存。

Type error: Could not write file '/code/.next/cache/.tsbuildinfo': EACCES: permission denied, open '/code/.next/cache/.tsbuildinfo'.

显然,您需要 root 权限才能使用 buildkit 缓存挂载。 这是一个问题,因为我无法以 root 身份构建 Next。

我的解决方法是在其他地方创建缓存,然后将文件复制到.next/cache和从中复制。 由于某种原因,cp 命令在 docker 中不起作用(作为节点,您会收到权限错误,而作为 root,您不会收到任何错误,但它仍然不起作用。)我最终想出了这个:

# syntax=docker/dockerfile:1.3
FROM node:16.15-alpine3.15 AS nextcache
#create cache and mount it
RUN --mount=type=cache,id=nxt,target=/tmp/cache \
    mkdir -p /tmp/cache && chown node:node /tmp/cache

FROM node:16.15-alpine3.15 as builder
USER node

#many lines later

# Build next
COPY --chown=node:node . /code
#copy mounted cache into actual cache
COPY --chown=node:node --from=nextcache /tmp/cache /code/.next/cache

RUN npm run build


FROM builder as nextcachemount
USER root

#update mounted cache
RUN mkdir -p tmp/cache

COPY --from=builder /code/.next/cache /tmp/cache

RUN --mount=type=cache,id=nxt,target=/tmp/cache \
    cp -R /code/.next/cache /tmp

我设法在挂载的缓存中存储了一些东西,但我没有注意到任何性能提升。(我正在尝试为 Next 实现这个挂载的缓存,以节省每次构建的时间。现在,构建下一步需要大约 160 秒,我希望能把它降低一点。)

如果您在节点官方镜像中使用节点用户,恰好有 uid=1000 和相同的 gid,我认为您应该在挂载缓存时指定,以便您有权对其进行写入:

RUN --mount=type=cache,target=/code/.next/cache,uid=1000,gid=1000 npm run build

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM