Docker开发环境中nodemon: Permission denied问题解决求助
Docker Node.js开发环境nodemon权限拒绝问题解决
问题场景
搭建Node.js v16.16.0 Docker开发环境,使用Nodemon和Docker卷实现本地文件与容器同步,相关配置及操作如下:
Dockerfile.dev
FROM node:alpine WORKDIR /usr/src/app COPY . . RUN npm install EXPOSE 3000 CMD ["npm", "run", "dev"]
package.json
{ "name": "docker-example-1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index", "dev": "nodemon index", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "Kane Hooper <kanehooper@hotmail.com>", "license": "MIT", "dependencies": { "express": "^4.18.1" }, "devDependencies": { "nodemon": "^2.0.19" } }
执行启动命令:
docker run -p 8080:3000 -v $(pwd):/usr/src/app -v /usr/src/app/node_modules --name nodeappcontainer nodeapp
运行后报错:
/tmp/dev6585779965.sh: line 2: nodemon: Permission denied
解决方法
方法1:用npx调用nodemon
修改package.json的dev脚本,通过npx指定调用容器内本地node_modules中的nodemon:
"scripts": { "start": "node index", "dev": "npx nodemon index", "test": "echo \"Error: no test specified\" && exit 1" }
重新构建镜像并启动容器即可,npx会自动定位到node_modules/.bin下的可执行文件,规避权限路径问题。
方法2:全局安装nodemon
修改Dockerfile.dev,将nodemon安装为全局包:
FROM node:alpine WORKDIR /usr/src/app COPY . . RUN npm install && npm install -g nodemon EXPOSE 3000 CMD ["npm", "run", "dev"]
全局安装的nodemon会被加入系统PATH,无需依赖本地node_modules的权限,直接运行nodemon命令即可。
方法3:使用非root用户运行容器
Alpine镜像默认以root用户运行,挂载本地目录易引发权限冲突。修改Dockerfile.dev创建并切换到非root用户:
FROM node:alpine WORKDIR /usr/src/app # 创建非root用户组和用户 RUN addgroup -S appgroup && adduser -S appuser -G appgroup COPY . . RUN npm install # 切换到非root用户 USER appuser EXPOSE 3000 CMD ["npm", "run", "dev"]
该方式符合容器安全规范,同时避免root权限带来的文件权限问题。
方法4:修正本地文件权限
若本地项目目录或node_modules由root用户创建,挂载到容器后会触发权限拒绝。在本地执行以下命令修改权限:
sudo chown -R $USER:$USER .
删除本地node_modules目录(容器内的node_modules由匿名卷维护,不会被覆盖),重新启动容器即可。
内容的提问来源于stack exchange,提问作者Kane Hooper
相关产品推荐
相关产品推荐

