nodejs / docker-node

Official Docker Image for Node.js :whale: :turtle: :rocket:
https://hub.docker.com/_/node/
MIT License
8.27k stars 1.97k forks source link

node user has no write permissions on host bind-mount volume #1991

Open mhabsaoui opened 1 year ago

mhabsaoui commented 1 year ago

Environment

Expected Behavior

My docker nodeJs app has is started, inside a Dockerfile, with node user that should write Winston logs to file on host bind-mount volume

Current Behavior

The logs folder stays empty without no log file inside, same on host or inside the container

Possible Solution

I have looked all possible issues solutions and the official docker Doc. but in vain : creating special user with same uid:gid as host's one, giving folder permissions other than root one in Dockerfile... Only the data volume container remains to be investigated, but never experienced such way.

Steps to Reproduce

Run the docker app with integration Compose file (integ target) : docker compose -f compose.integ.yml up --build --force-recreate Then, send a Postman POST request on http://0.0.0.0:8000/log URL to trigger the node app logger => logs only written if Dockerfile USER is root :-/

Screenshot when in root user : image

Dockerfile :

FROM node:lts-slim as base
ENV NODE_ENV=production
ENV HOST 0.0.0.0
WORKDIR /app
COPY package*.json .
RUN npm config list
RUN npm ci --force \
    && npm cache clean --force

FROM base as dev
ENV NODE_ENV=development
ENV PORT 3000
EXPOSE 3000
COPY . .
RUN npm config list
RUN npm install --force \
    && npm cache clean --force

FROM dev as scanner
RUN npm audit
COPY --from=aquasec/trivy:latest /usr/local/bin/trivy /usr/local/bin/trivy
RUN trivy fs --severity "HIGH,CRITICAL" --no-progress --scanners vuln .

FROM scanner as builder
RUN npm run build

FROM base as integ
ENV PORT 8000
EXPOSE 8000
COPY --from=builder /app/dist .
USER node
CMD [ "node", "main.js" ]
HEALTHCHECK CMD curl http://127.0.0.1/ || exit 1

Compose file :

services:
  server:
    platform: 'linux/amd64'
    restart: always
    init: true
    build:
      context: .
      target: integ
    env_file: ./.env
    ports:
      - 8000:8000
    volumes:
      - ./logs:/app/logs:rw

Additional Information

LaurentGoderre commented 1 year ago

My guess it's that it's a mismatch in user id. The Node user id is 1000. You could make the folder writable to all cmod a+r to address this.

mhabsaoui commented 1 year ago

My guess it's that it's a mismatch in user id. The Node user id is 1000. You could make the folder writable to all cmod a+r to address this.

I have tried that, to mod the node user to meet my host uid/gid, according to good practices for non root user, but the logs directory seems to remain under "root:root" permissions...

RUN groupmod -g 1001 node && usermod -u 1001 -g 1001 node

Also tried to chmod/chown the directory itsefl, but in vain.

RUN mkdir logs \
    && touch logs/unifaccess_log.jsonl \
    && touch logs/error_log.jsonl \
    && chmod -R 777 logs/ \
    && chown -R node:node logs/

Below, file permissions inside container VS host project :

image

LaurentGoderre commented 1 year ago

That run command would not be useful if you override it with a volume mount in you compose though no?