You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线构建Node应用遭遇npm缓存权限问题求助

Fixing npm EACCES Permission Error in Jenkins Pipeline for Node App Builds

Hey there, let’s dig into this frustrating npm permission issue you’re facing in your Jenkins pipeline running on a VM. I’ve run into this exact scenario with containerized builds before, so here’s what’s going on and actionable fixes to get your build back on track:

Why This Happens

The error points to /.npm because the container’s non-root user (uid 111:gid 120) has its HOME environment variable set to / instead of a proper user directory. When npm tries to create its cache folder, it attempts to write to / (which is owned by root), triggering the EACCES error.

Your earlier sudo chown command failed because:

  • The /.npm directory doesn’t exist yet (npm only creates it on first run)
  • You were running the command in the Jenkins agent’s context, not inside the container where the build is actually happening.

Solutions to Try

1. Specify a Local Cache Directory for npm

The quickest fix is to tell npm to use a cache directory inside your project folder (where the container user has write permissions). Modify your npm install command in the Jenkinsfile or Dockerfile to include the --cache flag:

npm install --cache ./npm-cache

This creates a npm-cache folder in your working directory, avoiding the root-owned / entirely.

2. Properly Configure Non-Root User in Dockerfile

If you’re building a custom Docker image, set up a dedicated non-root user with a valid HOME directory. This is the most sustainable fix:

# Use an official Node.js base image
FROM node:20-alpine

# Create a non-root user and group
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Set the user's home directory and working directory
ENV HOME /home/appuser
WORKDIR $HOME/app

# Switch to the non-root user before running npm commands
USER appuser

# Copy package files and install dependencies (now with proper permissions)
COPY package*.json ./
RUN npm install

# Copy the rest of your app code
COPY . .

Now npm will use /home/appuser/.npm as its cache directory, which the appuser owns and can write to without permission issues.

3. Fix Permissions Inside the Jenkins Pipeline Stage

If you’re using a pre-built image and can’t modify the Dockerfile, adjust permissions within your Jenkins pipeline stage inside the container context:

stage('Install Dependencies') {
    steps {
        // Create the npm cache directory in the container's user home
        sh 'mkdir -p $HOME/.npm'
        // Set ownership to the container's user (match the uid/gid from your error)
        sh 'chown -R 111:120 $HOME/.npm'
        // Run npm install with the corrected cache location
        sh 'npm install'
    }
}

Just make sure $HOME resolves to the container user’s home directory (not the Jenkins agent’s home). You can verify this by adding sh 'echo $HOME' to the stage first.

Key Takeaway

The core issue is mismatched permissions between the container’s user and the directory npm tries to use. Avoid running npm as root (it’s a security risk anyway) — instead, either redirect the cache to a writable directory or properly configure a non-root user with a valid home path.

内容的提问来源于stack exchange,提问作者the_piper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:24:06