Spring Boot容器ENTRYPOINT执行失败:无法访问Jar包问题排查
问题根源
你遇到的启动错误核心原因是:容器内的/opt/rest.galleries目录被主机挂载的目录完全覆盖。
你在Dockerfile中将app.jar添加到了容器的/opt/rest.galleries目录下,但启动容器时通过Compose把主机的/opt/rest.galleries/挂载到了容器的同一路径。由于Docker的挂载规则,主机目录会完全替换容器内对应路径的内容——而你的主机/opt/rest.galleries目录里只有galleries子文件夹,没有app.jar,所以启动时自然找不到这个jar文件。
解决方案
需要把应用jar包和需要挂载的图片目录分开存放,避免挂载操作覆盖jar所在路径,具体修改如下:
1. 修改Dockerfile
将jar包放到容器内独立的应用目录,不与挂载目录重叠:
FROM amd64/eclipse-temurin:22-jre # 创建独立的应用目录、图片目录和日志目录 RUN mkdir -p /opt/app /opt/rest.galleries/galleries /opt/rest.galleries/logs ARG JAR_FILE # 将jar包添加到独立的应用目录 ADD ${JAR_FILE} /opt/app/app.jar EXPOSE 8000 # 调整启动命令指向新路径的jar包 ENTRYPOINT ["java","-jar","/opt/app/app.jar"]
2. 修改compose.yml
只挂载主机的图片目录(和日志目录,若需要持久化日志)到容器对应路径,不再挂载整个/opt/rest.galleries:
services: rest_galleries: image: rest.galleries:3.5.0 ports: - 8000:8000 volumes: # 仅挂载主机的图片目录到容器对应位置 - /opt/rest.galleries/galleries:/opt/rest.galleries/galleries # 可选:挂载日志目录实现日志持久化 - /opt/rest.galleries/logs:/opt/rest.galleries/logs
3. 重新构建镜像并启动
执行以下命令重新构建镜像,再启动容器:
# 重新构建镜像(确保JAR_FILE参数指向你的实际jar路径,比如target下的文件) docker build --build-arg JAR_FILE=target/your-app.jar -t rest.galleries:3.5.0 . # 启动容器 docker compose up -d
这样调整后,容器内的jar包存放在独立的/opt/app目录,不会被挂载操作覆盖;同时主机的图片目录正常挂载到容器内的/opt/rest.galleries/galleries,你的Spring Boot应用依然可以正常访问该目录下的图片资源。
内容的提问来源于stack exchange,提问作者CraigFoote
相关产品推荐
相关产品推荐

