WSL2环境中Docker容器运行npm脚本遇Permission denied问题求助
解决WSL集成Docker环境下ts-node权限拒绝问题
问题背景
在开启WSL集成的Windows环境中,基于官方node镜像构建Docker容器后,运行任意npm脚本均报错sh: 1: ts-node: Permission denied。相同镜像在原生Linux系统可正常运行,已尝试Debian和openSUSE两种WSL发行版,问题依旧。
环境配置
- 已安装Docker Desktop,启用WSL集成并设置默认发行版
- Dockerfile内容:
FROM node WORKDIR /srv/app COPY ["package.json", "package-lock.json", "./"] RUN npm install COPY . . CMD ["npm", "start"]
- npm start脚本:
ts-node src/app.ts - 运行命令:
docker build -t sof . docker run sof
- 报错信息:
> app@1.0.0 start > ts-node src/app.ts sh: 1: ts-node: Permission denied
解决方案
方案1:用npx调用本地ts-node
修改package.json中的start脚本,通过npx直接调用项目本地安装的ts-node:
"scripts": { "start": "npx ts-node src/app.ts" }
npx会自动查找项目node_modules/.bin目录下的ts-node,避免全局路径的权限映射问题。
方案2:修复node_modules二进制文件权限
在Dockerfile中添加权限设置步骤,确保ts-node可执行:
FROM node WORKDIR /srv/app COPY ["package.json", "package-lock.json", "./"] RUN npm install COPY . . # 修复二进制文件执行权限 RUN chmod -R +x node_modules/.bin/ CMD ["npm", "start"]
WSL与Windows的文件权限映射可能导致COPY后的二进制文件丢失执行权限,此命令可强制添加执行权限。
方案3:切换为node用户运行容器
官方node镜像内置了非root的node用户,切换用户可避免root权限与WSL文件系统的冲突:
FROM node WORKDIR /srv/app COPY ["package.json", "package-lock.json", "./"] RUN npm install COPY . . # 切换为node用户 USER node CMD ["npm", "start"]
内容的提问来源于stack exchange,提问作者ACiep
相关产品推荐
相关产品推荐

