Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 331
S1MB10T3 Avatar asked Apr 30 '19 18:04

S1MB10T3


4 Answers

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

like image 127
Shnd Avatar answered Nov 11 '22 15:11

Shnd


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
like image 22
Perennialista Avatar answered Nov 11 '22 17:11

Perennialista


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

like image 9
Buchanora Avatar answered Nov 11 '22 17:11

Buchanora


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
like image 4
Benson Lu Avatar answered Nov 11 '22 15:11

Benson Lu