Docker部署Spring Boot 3应用报错:无法访问jar文件
Spring Boot 3 Docker部署报错:无法访问/app.jar
问题场景
在M1 MacBook上部署Spring Boot 3应用到Docker容器,运行容器时出现以下错误:
docker run -p 8080:8080 myapp_backend:0.0.1 Error: Unable to access jarfile /app.jar
相关文件及日志
Dockerfile内容
FROM maven:3.8.4-openjdk-17 AS build-stage WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY ./src ./src RUN mvn clean install -Dmaven.test.skip=true # Stage 2 FROM openjdk:17-jdk-slim AS production-stage WORKDIR /app COPY --from=build-stage /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
Docker构建日志
> docker build -t myapp_backend:0.0.1 . [+] Building 3.2s (15/15) FINISHED docker:rancher-desktop => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 735B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/openjdk:17-jdk-slim 3.2s => [internal] load metadata for docker.io/library/maven:3.8.4-openjdk-17 3.2s => [build-stage 1/6] FROM docker.io/library/maven:3.8.4-openjdk-17@sha256:7106ce47b5c226ee21bac386cb706ff9f3db7ac2f15e251e3aa491fcbfc30028 0.0s => [production-stage 1/3] FROM docker.io/library/openjdk:17-jdk-slim@sha256:aaa3b3cb27e3e520b8f116863d0580c438ed55ecfa0bc126b41f68c3f62f9774 0.0s => [internal] load build context 0.0s => => transferring context: 1.64kB 0.0s => CACHED [production-stage 2/3] WORKDIR /app 0.0s => CACHED [build-stage 2/6] WORKDIR /app 0.0s => CACHED [build-stage 3/6] COPY pom.xml . 0.0s => CACHED [build-stage 4/6] RUN mvn dependency:go-offline 0.0s => CACHED [build-stage 5/6] COPY ./src ./src 0.0s => CACHED [build-stage 6/6] RUN mvn clean install -Dmaven.test.skip=true 0.0s => CACHED [production-stage 3/3] COPY --from=build-stage /app/target/*.jar app.jar 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:f5ca156d9ebda2118100dc1d75ec6240f3e9c283686ea51599cad313bf5744c8 0.0s => => naming to docker.io/library/myapp_backend:0.0.1 0.0s
解决方案
1. 修正jar文件路径错误
Dockerfile中production-stage的工作目录是/app,复制jar时指定的是当前目录的app.jar,因此实际路径为/app/app.jar,但ENTRYPOINT中写的是根目录下的/app.jar,导致找不到文件。修改ENTRYPOINT为以下任意一种:
# 使用相对路径(推荐,基于WORKDIR) ENTRYPOINT ["java", "-jar", "app.jar"] # 或者使用完整绝对路径 ENTRYPOINT ["java", "-jar", "/app/app.jar"]
2. 刷新构建缓存,确认jar生成
构建日志中所有步骤都显示CACHED,说明缓存未更新,可能Maven构建未实际生成jar文件。执行以下命令重新构建(禁用缓存):
docker build --no-cache -t myapp_backend:0.0.1 .
同时检查本地项目的target目录是否存在生成的jar文件,确认mvn clean install -Dmaven.test.skip=true命令执行成功。
3. M1架构适配(可选)
M1是ARM架构,若使用的基础镜像是AMD64架构,可能存在兼容性问题。可以在Dockerfile开头指定平台:
FROM --platform=linux/arm64 maven:3.8.4-openjdk-17 AS build-stage FROM --platform=linux/arm64 openjdk:17-jdk-slim AS production-stage
或者构建时指定平台参数:
docker build --platform=linux/arm64 -t myapp_backend:0.0.1 .
内容的提问来源于stack exchange,提问作者demiglace
相关产品推荐
相关产品推荐

