Docker入口脚本在Linux环境找不到文件,但macOS正常问题排查
问题排查与解决
原因1:换行符不兼容
macOS默认使用CRLF换行格式,而Linux系统要求Shell脚本必须使用LF换行。当镜像在EKS的Linux节点运行时,CRLF会被当作脚本路径的一部分,导致系统无法正确识别脚本文件,最终抛出"文件不存在"的错误。
解决方法:
- 用文本编辑器(如VS Code)打开
entrypoint.sh,点击右下角的CRLF标识,切换为LF后保存。 - 或者在Docker构建阶段自动转换:如果基础镜像基于Debian/Ubuntu,添加以下命令:
如果是Alpine镜像,替换为:RUN apt-get update && apt-get install -y dos2unix && dos2unix entrypoint.sh && rm -rf /var/lib/apt/lists/*RUN apk add --no-cache dos2unix && dos2unix entrypoint.sh
原因2:脚本缺少执行权限
虽然你设置了文件的所有者,但可能未给脚本添加执行权限。Linux系统无法执行无权限的脚本,也会触发类似"文件不存在"的错误提示。
解决方法:
在Dockerfile的COPY命令后添加权限设置:
COPY --chown=my-service:my-service entrypoint.sh entrypoint.sh RUN chmod +x entrypoint.sh # 添加执行权限 COPY --chown=my-service:my-service target/my-service-0.0.1-SNAPSHOT.jar my-service.jar
或者使用Docker 17.09+支持的直接指定权限的写法:
COPY --chown=my-service:my-service --chmod=755 entrypoint.sh entrypoint.sh
额外优化建议
- 由于已经设置
WORKDIR /home/my-service,ENTRYPOINT可以简化为["./entrypoint.sh"],避免绝对路径拼写失误。 - 本地构建前可先验证脚本状态:执行
file entrypoint.sh,正常的Shell脚本会显示entrypoint.sh: Bourne-Again shell script, ASCII text executable。
内容的提问来源于stack exchange,提问作者hitchhiker
相关产品推荐
相关产品推荐

