Docker部署Django项目报错exec ./start.sh: no such file or directory求助
解决Windows 10下Docker中start.sh执行报错"no such file or directory"的问题
核心问题分析
报错本质并非文件不存在,而是以下几个常见原因叠加导致:
- Windows换行符冲突:Windows默认用
CRLF换行,而Linux容器仅识别LF,导致脚本解释器路径解析错误 - Alpine镜像缺少bash:Alpine默认仅预装
ash,若脚本指定#!/bin/bash会找不到解释器 - 镜像构建与挂载的冲突:本地挂载的
start.sh会覆盖镜像内已处理的脚本,若本地文件未修正换行符则报错 - ENTRYPOINT与CMD未联动:原脚本未传递CMD参数,导致迁移后无法启动服务
具体修复步骤
1. 修正start.sh脚本
- 切换换行符为
LF:在VS Code右下角点击CRLF,选择LF;或用WSL执行dos2unix start.sh转换 - 调整脚本内容,添加参数传递逻辑,确保迁移后执行启动命令:
#!/bin/sh # 生成迁移文件 python manage.py makemigrations # 应用数据库迁移 python manage.py migrate # 执行后续命令(承接Dockerfile中的CMD) exec "$@"
2. 优化Dockerfile
- 移除重复的
COPY start.sh .(已通过COPY . .复制) - 若坚持使用bash,需在Alpine中安装;否则改用
#!/bin/sh适配默认shell - 修正后的Dockerfile:
FROM python:3.11.3-alpine ENV PYTHONBUFFERED=1 WORKDIR /code # 可选:如需bash,取消下方注释安装 # RUN apk add --no-cache bash COPY requirements.txt . RUN pip install -r requirements.txt --upgrade COPY . . RUN chmod +x start.sh ENTRYPOINT ["./start.sh"] EXPOSE 8000 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
3. 验证挂载与镜像一致性
- 临时注释
docker-compose.yml中api服务的- .:/code挂载,重新构建镜像并启动:
若能正常运行,说明本地挂载的docker-compose build api docker-compose upstart.sh仍有格式问题,需确保本地文件已转为LF换行
4. 避免Windows自动转换换行符
- 若使用Git,执行以下命令禁用自动CRLF转换:
重新拉取或提交代码,确保文件以LF格式存储git config --global core.autocrlf false
内容的提问来源于stack exchange,提问作者hifichevymane
相关产品推荐
相关产品推荐

