Docker Compose挂载目录后找不到run.dev.sh的解决求助
解决WSL2+Docker挂载本地目录导致找不到run.dev.sh的问题
核心原因
使用./:/app卷映射时,WSL2本地目录会完全覆盖容器内/app目录的原有内容,包括Docker构建过程中复制进去的run.dev.sh脚本,导致容器启动时找不到该文件。
可行解决方案
方案1:挂载具体源码目录,避免覆盖容器内关键文件
不要直接挂载根目录到/app,只挂载需要热重载的源码目录(如app/、public/等),保留容器内的node_modules和脚本文件:
# docker-compose.yml 配置示例 services: remix-app: build: . volumes: - ./app:/app/app - ./public:/app/public - ./remix.config.js:/app/remix.config.js # 根据项目需求添加其他需要热重载的文件/目录 command: sh run.dev.sh
方案2:将脚本放到独立目录,避免被挂载覆盖
修改Dockerfile,把run.dev.sh复制到容器内非挂载目录(如/scripts),确保挂载时不会被覆盖:
# Dockerfile 配置示例 FROM node:20-alpine WORKDIR /app # 先复制脚本到独立目录并赋予执行权限 COPY run.dev.sh /scripts/run.dev.sh RUN chmod +x /scripts/run.dev.sh # 复制依赖文件并安装 COPY package*.json ./ RUN npm install # 复制项目源码 COPY . . # 启动命令指向脚本的新路径 CMD ["sh", "/scripts/run.dev.sh"]
之后docker-compose.yml可正常使用./:/app挂载,脚本不会被覆盖。
方案3:使用WSL2原生路径执行命令
确保在WSL2终端内运行docker-compose命令,而非Windows的CMD/PowerShell。使用WSL2内的项目绝对路径挂载:
volumes: - /home/你的用户名/你的项目目录:/app
同时确保WSL2内的run.dev.sh有执行权限:
chmod +x run.dev.sh
方案4:直接执行命令替代脚本
如果run.dev.sh内容简单,可直接在docker-compose的command中写命令,跳过脚本文件:
command: npm run dev
需确保package.json中存在dev脚本,对应Remix的开发启动命令。
验证步骤
- 执行
docker-compose build重新构建镜像 - 执行
docker-compose up启动容器 - 修改本地源码,确认热重载功能正常
内容的提问来源于stack exchange,提问作者deadcoder0904
相关产品推荐
相关产品推荐

