Docker启动容器报HTTP 400错误 找不到./entrypoint.sh如何解决
Docker启动容器报entrypoint.sh不存在错误排查方案
核心报错信息:
Error invoking remote method 'docker-start-container': Error: (HTTP code 400) unexpected - failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "./entrypoint.sh": stat ./entrypoint.sh: no such file or directory: unknown
常见触发原因
- 镜像构建环节未将
entrypoint.sh脚本拷贝到容器内对应路径,可能是Dockerfile中COPY指令路径写错,或是.dockerignore规则把本地的entrypoint.sh排除,导致镜像内部根本没有该文件 - 路径匹配错误:Dockerfile中
WORKDIR配置、docker run命令-w参数、docker-compose中working_dir配置的工作目录,和entrypoint.sh实际存放路径不一致,使用相对路径./entrypoint.sh时自然无法定位文件 - 脚本格式异常:在Windows环境编写的
entrypoint.sh默认使用CRLF换行符,Linux运行时无法识别该格式,会抛出文件不存在的误报 - 挂载覆盖:启动容器时将本地空目录/其他目录挂载到了
entrypoint.sh所在的容器目录,把镜像中原有的脚本文件覆盖掉了 - 少数旧版本runc运行时,会在脚本无执行权限时抛出找不到文件的异常,而非标准的权限不足报错
修复步骤
- 先定位文件实际位置,执行以下命令启动临时调试容器,绕过原入口点进入容器内部:
docker run --rm -it --entrypoint sh 你的镜像名称:镜像标签
进入容器后执行find / -name entrypoint.sh查看脚本的绝对路径,后续把启动命令、Dockerfile里ENTRYPOINT配置的相对路径替换为查到的绝对路径即可,比如查到路径为/app/entrypoint.sh就直接写全路径,不要用./开头的相对路径。
2. 修正镜像构建配置:
- 检查Dockerfile的
COPY指令,确认entrypoint.sh被正确拷贝到容器目标路径,同时检查.dockerignore文件,确认没有把entrypoint.sh加入排除列表 - 尽量在
ENTRYPOINT/CMD配置中使用脚本绝对路径,避免依赖工作目录的相对路径 - 在Dockerfile中增加执行权限配置:
RUN chmod +x /脚本所在绝对路径/entrypoint.sh
- 修正脚本格式:如果是Windows环境编写的脚本,用dos2unix工具转换换行符,或在代码编辑器中将换行符切换为
LF格式后重新保存,重新构建镜像即可 - 检查挂载配置:核对docker run的
-v参数、docker-compose的volumes配置,如果挂载目标路径是entrypoint.sh所在目录,要么调整挂载路径避开该目录,要么把entrypoint.sh放到本地挂载的对应目录中
内容的提问来源于stack exchange,提问作者kk1988
相关产品推荐
相关产品推荐

