Docker部署Spring Boot报错:./mvnw未找到 求助
问题描述
尝试在Docker中运行Spring Boot应用失败,提示找不到./mvnw。
我的Dockerfile:
FROM eclipse-temurin:17-jdk-alpine LABEL authors="Akkarawit" COPY . ./backEndAPI WORKDIR /backEndAPI RUN chmod +x mvnw RUN ./mvnw clean package ENTRYPOINT ["java","-jar","/app.jar"] EXPOSE 8080
构建错误日志:
[+] Building 8.7s (10/10) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 241B 0.0s => [internal] load metadata for docker.io/library/eclipse-temurin:17-jdk-alpine 7.7s => [auth] library/eclipse-temurin:pull token for registry-1.docker.io 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => CACHED [1/5] FROM docker.io/library/eclipse-temurin:17-jdk-alpine@sha256:9909002ad26c12ac3be05d258f6424cd25620042ab682358a5dfbfe866885846 0.0s => [internal] load build context 0.0s => => transferring context: 1.67kB 0.0s => [2/5] COPY . ./backEndAPI 0.0s => [3/5] WORKDIR /backEndAPI 0.0s => [4/5] RUN chmod +x mvnw 0.3s => ERROR [5/5] RUN ./mvnw clean package 0.5s ------ > [5/5] RUN ./mvnw clean package: 0.434 /bin/sh: ./mvnw: not found ------ Dockerfile:6 -------------------- 4 | WORKDIR /backEndAPI 5 | RUN chmod +x mvnw 6 | >>> RUN ./mvnw clean package 7 | ENTRYPOINT ["java","-jar","/app.jar"] 8 | EXPOSE 8080 -------------------- ERROR: failed to solve: process "/bin/sh -c ./mvnw clean package" did not complete successfully: exit code: 127
解决办法
1. 检查本地是否存在mvnw相关文件
如果本地Spring Boot项目没有生成mvnw脚本和.mvn目录,Docker构建时自然找不到文件。
- 执行命令生成:在项目根目录运行
mvn wrapper:wrapper,确保.mvn目录、mvnw、mvnw.cmd文件存在后再重新构建。
2. 排查.dockerignore规则
从构建上下文仅1.67kB的日志来看,大概率是.dockerignore忽略了mvn相关文件,导致COPY步骤没把文件复制进镜像。
- 打开项目根目录的
.dockerignore,删除忽略mvnw、mvnw.cmd、.mvn的规则。
3. 解决Alpine镜像缺少bash依赖问题
mvnw脚本默认依赖bash,但Alpine镜像仅自带sh,会导致脚本执行时报错“找不到文件”(实际是找不到bash解释器)。
- 修改Dockerfile,先安装bash,同时修正jar包路径错误:
FROM eclipse-temurin:17-jdk-alpine LABEL authors="Akkarawit" # 安装bash依赖 RUN apk add --no-cache bash COPY . ./backEndAPI WORKDIR /backEndAPI RUN chmod +x mvnw # 可选:加-DskipTests跳过测试,加快构建 RUN ./mvnw clean package -DskipTests # 修正jar包路径:mvn打包产物在target目录下 ENTRYPOINT ["java","-jar","/backEndAPI/target/*.jar"] EXPOSE 8080
4. 更优方案:使用多阶段构建
多阶段构建能剥离构建依赖,大幅减小最终镜像体积:
# 第一阶段:构建jar包 FROM eclipse-temurin:17-jdk-alpine AS builder RUN apk add --no-cache bash WORKDIR /app COPY . . RUN chmod +x mvnw RUN ./mvnw clean package -DskipTests # 第二阶段:运行应用 FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 从构建阶段复制jar包 COPY --from=builder /app/target/*.jar app.jar ENTRYPOINT ["java","-jar","app.jar"] EXPOSE 8080
内容的提问来源于stack exchange,提问作者anina
相关产品推荐
相关产品推荐

