Windows下Docker运行entrypoint.sh报语法错误:预期'do'却意外文件结束
解决Docker中entrypoint.sh在Windows下的语法错误问题
在Windows 10环境下运行Docker容器时,entrypoint.sh脚本触发以下错误:
entrypoint.sh: 12: Syntax error: end of file unexpected (expecting "do")
该脚本在macOS环境下运行正常,且已尝试将do单独换行,问题仍未解决。
Dockerfile内容
FROM python:3.10.13-slim ... # add entrypoint.sh COPY ./entrypoint.sh . RUN chmod +x /usr/src/app/entrypoint.sh # run entrypoint.sh ENTRYPOINT ["sh", "/usr/src/app/entrypoint.sh"]
entrypoint.sh内容
#!/bin/sh echo "Waiting for kafka..." while ! kcat -b $KAFKA_HOST:$KAFKA_PORT -L; do sleep 0.1 done echo "Kafka started" exec "$@"
解决方案
修正换行符格式
Windows默认使用CRLF(\r\n)换行,而Linux容器中的shell仅识别LF(\n)换行,这是最常见的原因。- 用文本编辑器(如VS Code)打开脚本,点击状态栏的「CRLF」选项,切换为「LF」后重新保存。
- 或者在Dockerfile中添加换行符转换命令,放在COPY之后、chmod之前:
RUN sed -i 's/\r$//' /usr/src/app/entrypoint.sh
调整ENTRYPOINT执行方式
直接使用脚本自身作为ENTRYPOINT,让系统自动调用脚本开头指定的解释器:
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
需确保脚本已通过chmod +x赋予执行权限。
- 验证脚本完整性
检查脚本是否在Windows编辑或复制过程中被意外截断,重新保存完整的脚本内容后再构建镜像。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

