'Docker - "Error: EACCES: permission denied, mkdir '/project/node_modules/.cache/@babel'"

Running yarn docker-build works fine but when yarn docker-up or yarn docker-dev an error pops up when RUN yarn is called. Nginx starts up fine but yarn fails into mkdir in the Projects directory.

package.json

...
    "docker-build": "docker-compose build",
    "docker-dev": "cross-env NGINX_HOST=localhost NGINX_PORT=3000 PORT=3000 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up --no-deps",
    "docker-up": "cross-env NGINX_HOST=localhost NGINX_PORT=80 PORT=8080 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --no-deps -d",
    "docker-down": "docker-compose down"
...

Dockerfile

FROM mhart/alpine-node:8

# Install required dependencies (Alpine Linux packages)
RUN apk update && \
  apk add --no-cache \
    sudo \
    g++ \
    gcc \
    git \
    libev-dev \
    libevent-dev \
    libuv-dev \
    make \
    openssl-dev \
    perl \
    python

# Add user and make it sudoer
ARG uid=1000
ARG user=username
RUN set -x ; \
  addgroup -g $uid -S $user ; \
  adduser -u $uid -D -S -G $user $user \
  && exit 0 ; exit 1
RUN echo $user' ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# Install (global) Yarn packages/dependencies
RUN yarn global add node-gyp
RUN git clone --recursive https://github.com/sass/node-sass.git \
  && cd node-sass \
  && yarn \
  && node scripts/build -f

# Make project directory with permissions
RUN mkdir /project

# Switch to project directory
WORKDIR /project

# Copy required stuff
COPY . .

# Give owner rights to the current user
RUN chown -Rh $user:$user /project

# Install (local) Yarn packages and build
RUN yarn

USER $user

Error

app_1    | [2] Error: EACCES: permission denied, mkdir '/project/node_modules/.cache/@babel'
app_1    | [2]     at Object.fs.mkdirSync (fs.js:885:18)
app_1    | [2]     at sync (/project/node_modules/mkdirp/index.js:71:13)
app_1    | [2]     at sync (/project/node_modules/mkdirp/index.js:77:24)
app_1    | [2]     at save (/project/node_modules/@babel/register/lib/cache.js:50:20)
app_1    | [2]     at _combinedTickCallback (internal/process/next_tick.js:132:7)
app_1    | [2]     at process._tickCallback (internal/process/next_tick.js:181:9)
app_1    | [2]     at Function.Module.runMain (module.js:696:11)
app_1    | [2]     at startup (bootstrap_node.js:204:16)
app_1    | [2]     at bootstrap_node.js:625:3

My repo can be found here at https://github.com/cozy-nyc/cozy-nyc



Solution 1:[1]

I had the same problem with npm. I fixed it using:

RUN npm config set unsafe-perm true

The other way is to specify it in your install command:

npm install -g --unsafe-perm thePackage

You can find the documentation for it here: https://docs.npmjs.com/misc/config#unsafe-perm

Solution 2:[2]

You probably have a volume specified in your docker-compose file and mounted as /project/node_modules, your user does not have permission to access that directory on your local disk.

Find out which local directory the volume is mapped to using this SO answer and change the owner with:

sudo chown -R yourusername:yourusername /path/to/node_modules

Solution 3:[3]

Try setting the user before running yarn in your Dockerfile.

# Give owner rights to the current user
RUN chown -Rh $user:$user /project

USER $user

# Install (local) Yarn packages and build
RUN yarn

Solution 4:[4]

Try adding volumes of ./node_modules to you docker-compose file under your application service.

Something like:

services:
  app:
    command: yarn start
    volumes:
      - .:/project
      - ./node_modules:/project/node_modules

Solution 5:[5]

I had these kinds of errors and after a long time of trying I found out that Docker's (Mac OS X) Experimental Features were the reason.

I had checked both "Use the new Virtualization framework" and "Enable VirtioFS accelerated directory sharing"

After disabling them, npm works properly.

Solution 6:[6]

I would suggest to do like what was suggested here (https://github.com/nodejs/docker-node/issues/1262#issuecomment-677577653). So change the following lines from this

# Copy required stuff
COPY . .

# Give owner rights to the current user
RUN chown -Rh $user:$user /project

to this

# Copy required stuff
COPY --chown $user:$user . .

Or as alternative change your WORKDIR (https://github.com/nodejs/docker-node/issues/740#issuecomment-458545074):

WORKDIR /home/node/project

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Perennialista
Solution 3 Buchanora
Solution 4 Benson Lu
Solution 5 Jaska
Solution 6