Docker构建正常但运行时tini执行/docker-entrypoint.sh找不到文件如何解决
Docker容器启动报错exec /docker-entrypoint.sh failed排查方案
你遇到的报错本质是系统无法正常执行/docker-entrypoint.sh脚本,排除权限问题后,可按以下优先级排查根因:
- 换行符格式错误(最高发)
如果你是在Windows环境下编写的docker-entrypoint.sh,文件默认会用CRLF作为换行符,而Linux容器仅识别LF格式的换行符。这会导致脚本第一行的shebang声明(比如#!/bin/bash)末尾被附加不可见的\r字符,系统找不到对应的解释器,就会抛出「No such file or directory」错误,很容易被误判为脚本文件本身不存在。
验证方案:在Dockerfile的RUN块中新增一行cat -A /docker-entrypoint.sh | head -n 1,重新构建后如果输出的第一行末尾带^M$标识,即可确认是换行符问题。
修复方案:用dos2unix工具转换脚本格式,或者在代码编辑器中将脚本的换行符设置为LF后重新构建镜像。 - shebang解释器声明错误
检查docker-entrypoint.sh首行的解释器声明,如果填写了不存在的路径也会触发该报错。比如写了#!/bin/bash但容器内bash实际路径为/usr/bin/bash,或者声明的解释器在镜像中未安装。建议统一使用兼容性更强的#!/usr/bin/env bash作为首行声明。 - 构建参数缺失导致COPY异常
你的COPY指令COPY docker-entrypoint.sh $component_exe /依赖构建参数component_exe,如果构建镜像时没有通过--build-arg component_exe=xxx传入对应值,该参数会为空,可能导致COPY指令解析异常,连带docker-entrypoint.sh的复制出现未知问题。你可以在构建时添加--progress=plain参数查看COPY步骤的执行日志,确认脚本确实被成功复制到容器根目录。 - 文件名拼写/大小写问题
Linux系统对文件名大小写敏感,确认你本地的脚本文件名拼写、大小写和Dockerfile中COPY、ENTRYPOINT中引用的名称完全一致,比如避免出现Docker-entrypoint.sh和docker-entrypoint.sh这类大小写不匹配的问题。
内容的提问来源于stack exchange,提问作者aram063
相关产品推荐
相关产品推荐

