Docker部署DRF后端报错:entrypoint.sh文件不存在或格式错误
问题现象
搭建DRF后端Docker测试API环境时,Docker Desktop抛出错误:exec /code/docker/entrypoints/entrypoint.sh: no such file or directory;移除脚本头部的#!/bin/sh后,又出现exec格式错误;修改脚本路径为/code/entrypoint.sh仍提示文件不存在。
核心原因与修复步骤
1. 修复脚本换行符不兼容问题
Windows系统创建的shell脚本默认使用CRLF换行格式,而Linux容器仅支持LF换行。这会导致脚本头部的#!/bin/sh被解析为#!/bin/sh\r,系统无法找到对应的解释器路径。
- 用VS Code打开
entrypoint.sh,点击右下角的CRLF标识,切换为LF; - 或通过git命令全局设置换行符:
git config --global core.autocrlf false,重新同步脚本文件。
2. 确认路径与挂载一致性
你的本地目录结构中,entrypoint.sh位于backend/docker/entrypoints/:
DRF_docker |__backend |__docker |__entrypoints |__entrypoint.sh
Dockerfile的构建上下文为./backend,执行COPY . /code/后,容器内脚本路径应为/code/docker/entrypoints/entrypoint.sh,该路径配置正确。但需注意:
docker-compose中volumes: - ./backend:/code会将本地backend目录挂载到容器/code,如果本地脚本文件缺失或路径错误,会覆盖容器内的文件,导致找不到脚本。务必确保本地backend/docker/entrypoints/entrypoint.sh存在。
3. 保留脚本解释器并确保权限
- 不要移除
#!/bin/sh,这是Linux系统识别shell脚本的必要标识,移除后系统无法判断脚本类型,会触发格式错误; - 确保脚本有可执行权限:Dockerfile中已配置
chmod +x /code/docker/entrypoints/entrypoint.sh,但如果本地挂载覆盖了容器内文件,需在本地执行:chmod +x backend/docker/entrypoints/entrypoint.sh。
4. 修复依赖文件名拼写错误
目录中requirements.txt被误写为reuiqrements.txt,会导致pip install -r /code/requirements.txt执行失败,影响容器构建。需将文件名修正为requirements.txt。
验证修复
完成上述修改后,重新构建并启动容器:
docker-compose down docker-compose build --no-cache docker-compose up
内容的提问来源于stack exchange,提问作者JohnyDeen Agent

