Win11运行Node.js Docker容器报docker-entrypoint.sh权限拒绝错误
问题现象
Windows 11环境下运行Docker启动Node.js容器,启动时报错:
/usr/local/bin/docker-entrypoint.sh: 11: exec: .: Permission denied
已在Dockerfile中添加为docker-entrypoint.sh赋予执行权限的指令,所有自行尝试的排查手段、周边人提供的思路均无效。
原Dockerfile配置:
FROM node RUN mkdir -p /home/node/app && chown -R node:node /home/node/app RUN chmod +x /usr/local/bin/docker-entrypoint.sh WORKDIR /home/node/app USER node COPY --chown=node:node package.json . COPY --chown=node:node . . RUN npm install CMD ["node", "js/main.js"]
问题原因
你添加的RUN chmod +x /usr/local/bin/docker-entrypoint.sh属于无效操作:官方Node基础镜像自带的入口脚本本身已经配置了可执行权限,这行命令既没解决核心问题,执行时机也不对。
报错本质是Windows环境Docker的特有问题:
- 你在文件复制、依赖安装步骤之前就切换到了
node低权限用户,Windows的NTFS文件系统默认不支持Linux的rwx权限位标记,构建时复制进镜像的文件不会自动带上可执行权限,低权限用户无法正常执行入口脚本需要调用的文件 - 如果你开启了WSL2的文件共享优化,还会进一步放大权限映射bug,导致所有挂载/复制进容器的文件全部丢失执行位
- 提前切换用户还会导致npm install阶段生成的依赖脚本权限异常,入口脚本执行到exec逻辑时就会抛出权限拒绝错误
修复方案
按如下规则调整Dockerfile即可解决:
- 删除无效的
RUN chmod +x /usr/local/bin/docker-entrypoint.sh行 - 所有文件复制、依赖安装、权限调整操作全部用root用户执行,所有操作完成后最后再切换到
node用户 - 给工作目录递归设置正确的权限和可执行位,抵消Windows文件系统的权限位缺失问题
调整后可用的Dockerfile配置:
FROM node WORKDIR /home/node/app # 先复制依赖清单安装依赖,利用Docker缓存加速构建 COPY package.json ./ RUN npm install # 复制全量项目文件 COPY . . # 统一调整目录归属和权限 RUN chown -R node:node /home/node/app && chmod -R 755 /home/node/app # 所有构建操作完成后最后切换到低权限用户 USER node CMD ["node", "js/main.js"]
如果调整后仍有报错,排查三个Windows环境专属配置项:
- 检查本地项目根目录是否存在自定义的
docker-entrypoint.sh文件,避免COPY指令意外覆盖基础镜像自带的官方入口脚本 - 打开Docker Desktop设置,关闭WSL2引擎下的
Enable experimental WSL 2 file sharing optimizations实验特性,重启Docker后重新构建镜像,该特性会导致WSL2场景下文件权限映射完全失效 - 如果项目是通过Git拉取,先执行
git config --global core.autocrlf false后重新拉取代码,避免Windows默认的CRLF换行符破坏脚本格式
内容的提问来源于stack exchange,提问作者Eduardo Pitta
相关产品推荐
相关产品推荐

