运行Docker容器出现file not found错误,容器直接停止如何解决
错误原因分析
- 路径分隔符使用错误:你当前使用的
maven:3.8.1-adoptopenjdk-11是Linux系统镜像,Linux使用正斜杠/作为路径分隔符,你写的Windows风格反斜杠\在Linux shell中会被识别为转义符,因此home\prefs\run.bat会被解析为无分隔符的homeprefsrun.bat,和报错信息完全匹配。 - 大小写敏感问题:Linux系统对路径大小写敏感,你复制文件的目标路径是
/home/Prefs(大写P),而CMD中写的是prefs(小写p),路径本身也不匹配。 - 系统兼容性问题:bat是Windows平台的批处理脚本,Linux镜像原生不支持bat文件的执行,同时CMD中写的
cmd也是Windows独有命令,Linux环境不存在该命令。
第一步:确认文件是否成功复制到容器
执行以下命令直接进入容器交互终端,覆盖默认启动指令:
docker run -it --entrypoint /bin/sh demo2
进入容器后执行以下命令即可查看目录下的所有文件,确认复制是否成功:
ls -l /home/Prefs
推荐解决方案(保留Linux基础镜像)
将Windows批处理逻辑转换为Linux shell脚本,适配镜像环境:
- 项目目录下新建
run.sh文件,内容参考原bat文件逻辑编写,示例:
#!/bin/bash # 切换到jar包所在目录 cd /home/Prefs # 执行jar包,替换为你原bat中的实际启动参数 java -jar KickStart.jar
- 修改Dockerfile内容如下:
FROM maven:3.8.1-adoptopenjdk-11 COPY Prefs /home/Prefs COPY KickStart.jar /home/Prefs/KickStart.jar # 给shell脚本添加执行权限 RUN chmod +x /home/Prefs/run.sh # 执行启动脚本 CMD ["/home/Prefs/run.sh"]
- 重新构建镜像后执行run命令即可正常启动。
如果需要容器执行完脚本后保持运行不退出,可以把CMD修改为:
CMD ["/bin/sh", "-c", "/home/Prefs/run.sh && /bin/bash"]
启动时添加-it参数即可进入交互终端。
可选解决方案(保留bat文件)
如果必须使用bat脚本,需要将基础镜像替换为Windows版本的JDK镜像,示例:
FROM openjdk:11-jdk-windowsservercore COPY Prefs C:/home/Prefs COPY KickStart.jar C:/home/Prefs/KickStart.jar CMD C:/home/Prefs/run.bat
注意Windows镜像体积远大于Linux镜像,启动速度也更慢,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者VJ4Testing
相关产品推荐
相关产品推荐

