arthur-organic
arthur-organic

Reputation: 11

How to mount NextJS cache in Docker

Does anyone know a way to mount a Next cache in Docker?

I thought this would be relatively simple. I found buildkit had a cache mount feature and tried to add it to my Dockerfile.

COPY --chown=node:node . /code


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

However I found that I couldn't write to the cache as node.

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

Apparently you need root permissions for using the buildkit cache mount. This is an issue because I cannot build Next as root.

My workaround was to make a cache somewhere else, and then copy the files to and from the .next/cache. For some reason the cp command does not work in docker(as node, you get a permission error and as root you get no error, but it still doesn't work.) I eventually came up with this:

# 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

I managed to store something inside the mounted cache, but I have not noticed any performance boosts.(I am trying to implement this mounted cache for Next in order to save time every build. Right now, the build next step takes ~160 seconds, and I'm hoping to bring that down a bit.)

Upvotes: 1

Views: 3535

Answers (2)

remi4001
remi4001

Reputation: 1

I found out that creating the directories before the cache is mounted with:

RUN mkdir -p /code/.next

makes the intermediate directories correctly owned by the current user (and not root).

And then the build should succeed by using:

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

Upvotes: 0

N1ngu
N1ngu

Reputation: 3834

If you are using the node user in a node official image, which happens to have uid=1000 and the same gid, I think you should specify that when mounting the cache so that you have permission to write on it:

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

Upvotes: 1

Related Questions