docker-compose up --build启动容器报错文件不存在退出码127
问题根因
- 核心配置错误:Docker绑定挂载的覆盖机制导致镜像内文件被遮挡。你在
docker-compose.yaml中将宿主机目录${SERVER_HOST_DIR}直接挂载到容器/app/workspace路径时,镜像构建阶段通过COPY写入该路径的bin、config、lib目录会被宿主机目录完全覆盖。如果宿主机对应目录为空,容器内自然找不到startServer.sh文件,触发/bin/sh: ./startServer.sh: not found报错、退出码127,同时宿主机目录也不会自动生成镜像内置的文件,这是Docker的标准行为,不是构建流程出错。 - 潜在兼容问题:你使用的基础镜像是Alpine发行版,如果
startServer.sh是Windows环境下编写、使用CRLF格式换行符,Alpine的shell无法识别该格式,也会抛出"文件不存在"的假报错,即便挂载问题修复也可能触发该问题。
修复方案
- 方案1(生产环境推荐):缩小挂载范围,不覆盖整个应用目录
仅挂载需要持久化、需要宿主机修改的子目录(比如配置目录、日志目录),避免覆盖镜像内置的执行程序和依赖库,修改docker-compose.yaml的volumes配置段:volumes: - ${SERVER_HOST_DIR}/config:/app/workspace/config # 如需持久化日志可追加对应挂载,示例: # - ${SERVER_HOST_DIR}/logs:/app/workspace/logs - 方案2(开发调试场景适用):宿主机目录预置全量代码
如果你需要挂载整个目录实现本地改代码容器内实时生效,不要在Dockerfile中COPY代码,直接将bin、config、lib全套文件放到宿主机${SERVER_HOST_DIR}路径下,并给bin/startServer.sh赋予可执行权限即可。 - 兼容修复(必做,避免踩换行符坑):
在Dockerfile中增加换行符转换步骤,适配Alpine镜像的执行要求,修改对应的RUN指令:
也可以直接在编写shell脚本时,将编辑器的换行符设置为Unix标准的LF格式,跳过安装dos2unix的步骤。# 安装dos2unix工具转换脚本换行符,再赋予执行权限 RUN apk add --no-cache dos2unix && \ dos2unix /app/workspace/bin/*.sh && \ chmod 774 /app/workspace/bin/*.sh
验证操作
修改配置后依次执行以下命令清理旧资源、重启服务:
docker-compose down -v docker-compose up --build
正常情况下容器将成功启动,6969端口可正常访问。
内容的提问来源于stack exchange,提问作者JongHwa
相关产品推荐
相关产品推荐

