Docker容器启动报错:entrypoint.sh文件找不到求助
问题排查与解决方案
最可能的原因:脚本行尾格式不兼容
如果你的entrypoint.sh是在Windows系统下编辑的,文件行尾会是CRLF(\r\n)格式,而Linux容器中的bash仅支持LF(\n)格式。这种情况下,bash会把脚本的shebang行解析为#!/bin/bash\r,无法识别带\r的命令路径,最终抛出类似“文件不存在”的误导性错误。
排查步骤
临时进入容器验证文件状态
执行以下命令跳过原entrypoint,启动容器并进入bash:docker run --rm -it server:latest /bin/bash进入容器后执行:
# 查看/app目录下的文件列表 ls -l /app/ # 查看脚本内容及行尾字符(^M代表CRLF格式) cat -A /app/entrypoint.sh若输出每行末尾有
^M,则确认是行尾格式问题。确认构建上下文路径
确保执行docker-compose up --build时,当前工作目录是包含docker-compose.yml的根目录,保证server/目录在构建上下文范围内。排除卷挂载覆盖
检查docker-compose.yml是否存在未展示的卷配置,若有卷挂载到/app目录,会覆盖容器内原有的文件。
解决方法
方法1:修改脚本行尾格式
用文本编辑器(如VS Code)打开entrypoint.sh,将行尾格式切换为LF:
- VS Code右下角可查看当前行尾格式,点击后选择
LF并保存。
方法2:在Dockerfile中添加行尾转换步骤
在RUN chmod +x /app/entrypoint.sh之前添加以下内容(二选一即可):
# 方式1:用sed命令转换(无需额外安装工具) RUN sed -i 's/\r$//' /app/entrypoint.sh
# 方式2:安装dos2unix工具转换 RUN apt-get update && apt-get install -y dos2unix && dos2unix /app/entrypoint.sh
方法3:简化ENTRYPOINT写法
若脚本shebang正确且行尾格式没问题,可直接将ENTRYPOINT设为脚本本身:
ENTRYPOINT ["/app/entrypoint.sh"]
内容的提问来源于stack exchange,提问作者Stefan Wobbe
相关产品推荐
相关产品推荐

