Docker镜像构建成功但运行时出现failed to create shim报错如何解决
问题排查与修复方案
你遇到的启动报错如下:
docker:Error response from daemon:failed to create shim:OCI runtime create failed:runc create failed: unable to start container PATH: unknown
这个报错本质是容器启动时无法找到ENTRYPOINT声明的可执行文件,你的Dockerfile存在多处配置错误,按以下步骤修复即可:
- 错误1:冗余的
FROM指令
Dockerfile中只有最后一个FROM声明的镜像会作为最终运行的基础镜像,你写的第一行FROM centos:7完全无效,对应层会在构建时被直接丢弃,无特殊需求直接删除该行即可。 - 错误2:
ENTRYPOINT配置不规范
你使用的是exec格式的入口点声明ENTRYPOINT ["server.sh", "start"],Docker只会在系统PATH环境变量包含的路径下查找server.sh文件,不会自动搜索当前工作目录;同时openjdk:8-jdk-alpine镜像默认工作目录为根目录/,你通过COPY . .拷贝的文件如果没有配置执行权限、路径不匹配,都会触发找不到可执行文件的报错。 - 错误3:文件拷贝逻辑存在隐患
COPY . .会将构建上下文目录下的所有文件全量拷贝到镜像内,既会增大镜像体积,也容易造成文件路径混乱。 - 错误4:跨平台脚本兼容问题
如果你在Windows环境下编写server.sh,文件默认带DOS换行符,且Alpine镜像默认没有预装bash,如果脚本用bash语法编写、没有指定正确的解释器,也会导致启动失败。
可直接使用的修复后Dockerfile
FROM openjdk:8-jdk-alpine # 明确指定工作目录,避免文件散落在根目录 WORKDIR /app # 拷贝项目文件 COPY . . # 给启动脚本加执行权限,清除Windows换行符;如果脚本依赖bash,放开下面注释安装bash # RUN apk add --no-cache bash RUN chmod +x server.sh && sed -i 's/\r$//' server.sh # 用绝对路径指定入口脚本,避免PATH查找失败 ENTRYPOINT ["/app/server.sh", "start"] EXPOSE 8080
额外校验步骤
- 检查
server.sh首行的解释器声明:如果用Alpine自带的shell,首行必须写#!/bin/sh;如果安装了bash,首行写#!/bin/bash,不要写错路径。 - 重新构建镜像后再启动容器:
docker build -t image_name . docker run -d -p 8080:8080 image_name
- 如果仍启动失败,执行以下命令直接进入容器内部调试,手动执行启动脚本看具体报错即可快速定位问题:
docker run --rm -it --entrypoint sh image_name # 进入容器后执行 cd /app && ./server.sh start
内容的提问来源于stack exchange,提问作者yash bhangare
相关产品推荐
相关产品推荐

