Windows WSL2 Docker Desktop启动Rails容器报错:找不到entrypoint.sh
解决Docker启动Rails容器时的entrypoint.sh找不到问题
常见原因及对应解决方法
1. 脚本换行符格式不兼容(Windows CRLF vs Linux LF)
Windows系统创建的entrypoint.sh默认用CRLF换行,而Linux容器仅识别LF格式,这会导致容器执行脚本时把CR字符当成命令的一部分,触发"找不到文件"的错误。
解决办法:
- 直接在WSL2的Linux环境中创建/编辑
entrypoint.sh,确保使用LF换行。 - 若在Windows编辑器中编辑,开启"使用LF换行"设置(比如VS Code右下角可切换格式)。
- 在Dockerfile中添加转换步骤,先安装dos2unix工具再转换脚本:
RUN apt-get install -y dos2unix COPY entrypoint.sh /usr/bin/ RUN dos2unix /usr/bin/entrypoint.sh && chmod +x /usr/bin/entrypoint.sh
2. 缺少正确的Shebang解释器声明
entrypoint.sh开头必须指定脚本解释器,否则容器无法识别执行程序。确保脚本第一行是:
#!/bin/bash
或根据容器环境使用#!/bin/sh,保存后再重新构建镜像。
3. 确认entrypoint.sh的位置与COPY命令正确性
- 确保
entrypoint.sh在项目根目录下(与Dockerfile同级),否则Dockerfile里的COPY entrypoint.sh /usr/bin/会找不到源文件,导致容器内无该脚本。 - 查看镜像构建日志,确认COPY步骤是否成功执行。
4. 手动验证容器内脚本状态
若以上步骤无效,可临时修改Dockerfile的CMD为bash,启动容器后手动进入排查:
docker-compose run web bash
在容器内执行以下命令检查:
ls -l /usr/bin/entrypoint.sh # 确认文件存在且有执行权限 cat /usr/bin/entrypoint.sh # 查看内容是否正确、换行符是否正常 ./usr/bin/entrypoint.sh # 手动执行脚本,查看具体报错
额外优化建议
- 将
ADD . /app替换为COPY . /app,ADD会自动解压压缩包,此处无需该功能,COPY更稳妥。 - 将entrypoint.sh的COPY步骤提前,利用Docker构建缓存减少重复构建时间。
内容的提问来源于stack exchange,提问作者Igor L. de Jesus
相关产品推荐
相关产品推荐

