Docker构建Spring Boot应用报错:./gradlew: not found 求助
Docker构建Spring Boot应用报错:
/bin/sh: 1: ./gradlew: not found 构建命令
docker build -t myapp:latest -f Dockerfile2 .
自定义Dockerfile内容
FROM adoptopenjdk/openjdk11 as builder WORKDIR /builder COPY gradlew ./ COPY gradle ./gradle COPY build.gradle ./ COPY settings.gradle ./ COPY src ./src RUN chmod +x ./gradlew RUN ./gradlew bootJar FROM adoptopenjdk/openjdk11 as runner WORKDIR /app COPY --from=builder /builder/build/libs/app.jar ./ EXPOSE 8080 CMD ["java","-jar","-Dspring.profiles.active=local","app.jar"]
完整报错信息
[+] Building 0.4s (14/15) docker:default => [internal] load build definition from Dockerfile2 0.0s => => transferring dockerfile: 450B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/adoptopenjdk/openjdk11:latest 0.0s => [internal] load build context 0.0s => => transferring context: 18.35kB 0.0s => [builder 1/9] FROM docker.io/adoptopenjdk/openjdk11 0.0s => CACHED [runner 2/3] WORKDIR /app 0.0s => CACHED [builder 2/9] WORKDIR /builder 0.0s => CACHED [builder 3/9] COPY gradlew ./ 0.0s => CACHED [builder 4/9] COPY gradle ./gradle 0.0s => CACHED [builder 5/9] COPY build.gradle ./ 0.0s => CACHED [builder 6/9] COPY settings.gradle ./ 0.0s => CACHED [builder 7/9] COPY src ./src 0.0s => CACHED [builder 8/9] RUN chmod +x ./gradlew 0.0s => ERROR [builder 9/9] RUN ./gradlew bootJar 0.3s ------ > [builder 9/9] RUN ./gradlew bootJar: 0.262 /bin/sh: 1: ./gradlew: not found ------ Dockerfile2:14 -------------------- 12 | RUN chmod +x ./gradlew 13 | 14 | >>> RUN ./gradlew bootJar 15 | 16 | FROM adoptopenjdk/openjdk11 as runner -------------------- ERROR: failed to solve: process "/bin/sh -c ./gradlew bootJar" did not complete successfully: exit code: 127 View build details: docker-desktop://dashboard/build/default/default/ut88drrrrlzvp10e5pnr6u1a4
已尝试的排查步骤
- 确认Dockerfile中已正确复制gradlew文件并设置执行权限
- 尝试在Docker镜像内先执行
chmod +x gradlew再运行gradlew - 尝试移除gradlew以观察构建过程变化
解决方案
1. 修复gradlew换行符(Windows环境常见问题)
Windows系统默认使用CRLF换行,而Linux容器需要LF格式,这会导致容器无法正确识别脚本开头的#!/bin/bash路径。
- 用git修复:
git config core.autocrlf false git rm --cached gradlew git add gradlew
- 或用文本编辑器(如VS Code)修改:打开gradlew,右下角点击
CRLF切换为LF,保存后重新构建。
2. 检查.dockerignore配置
如果.dockerignore文件中包含gradlew或匹配它的规则,会导致COPY命令无法将文件复制到容器中。
- 打开
.dockerignore,删除包含gradlew的行,或者添加!gradlew排除忽略规则。
3. 确认gradlew存在于构建上下文
- 检查本地项目根目录是否有gradlew文件,没有的话执行
gradle wrapper生成。 - 确保构建命令是在项目根目录执行(即命令末尾的
.指向项目根),否则调整COPY命令的源路径。
4. 替换为官方Gradle镜像构建(可选优化)
使用官方Gradle镜像避免环境差异,修改Dockerfile如下:
FROM gradle:7.6-jdk11 as builder WORKDIR /builder COPY --chown=gradle:gradle gradlew ./ COPY --chown=gradle:gradle gradle ./gradle COPY --chown=gradle:gradle build.gradle ./ COPY --chown=gradle:gradle settings.gradle ./ COPY --chown=gradle:gradle src ./src RUN ./gradlew bootJar FROM adoptopenjdk/openjdk11 as runner WORKDIR /app COPY --from=builder /builder/build/libs/app.jar ./ EXPOSE 8080 CMD ["java","-jar","-Dspring.profiles.active=local","app.jar"]
内容的提问来源于stack exchange,提问作者jun
相关产品推荐
相关产品推荐

