GitLab Runner中Docker执行gradlew时权限拒绝问题排查
Docker构建在GitLab Runner上出现gradlew权限拒绝问题
问题详情
本地执行Docker构建时一切正常,但在GitLab Runner上执行相同脚本,RUN ./gradlew -b /code/build.gradle buildNative步骤抛出权限拒绝错误:
/bin/sh: ./gradlew: Permission denied The command '/bin/sh -c ./gradlew -b /code/build.gradle buildNative' returned a non-zero code: 126
使用的Dockerfile如下:
FROM quay.io/quarkus/ubi-quarkus-native-image:21.3.1-java11 AS build COPY --chown=quarkus:quarkus gradlew /code/gradlew COPY --chown=quarkus:quarkus gradle /code/gradle COPY --chown=quarkus:quarkus build.gradle /code/ COPY --chown=quarkus:quarkus settings.gradle /code/ COPY --chown=quarkus:quarkus gradle.properties /code/ USER quarkus WORKDIR /code COPY src /code/src RUN ./gradlew -b /code/build.gradle buildNative
解决方案
1. 直接在COPY时设置可执行权限
如果Docker版本支持(17.09+),可以在COPY指令中直接添加--chmod参数,确保gradlew复制到容器后具备可执行权限:
FROM quay.io/quarkus/ubi-quarkus-native-image:21.3.1-java11 AS build COPY --chown=quarkus:quarkus --chmod=755 gradlew /code/gradlew COPY --chown=quarkus:quarkus gradle /code/gradle COPY --chown=quarkus:quarkus build.gradle /code/ COPY --chown=quarkus:quarkus settings.gradle /code/ COPY --chown=quarkus:quarkus gradle.properties /code/ USER quarkus WORKDIR /code COPY src /code/src RUN ./gradlew -b /code/build.gradle buildNative
2. 单独添加权限赋予步骤
若Docker版本不支持--chmod,可在复制gradlew后,通过RUN指令手动添加可执行权限:
FROM quay.io/quarkus/ubi-quarkus-native-image:21.3.1-java11 AS build COPY --chown=quarkus:quarkus gradlew /code/gradlew RUN chmod +x /code/gradlew COPY --chown=quarkus:quarkus gradle /code/gradle COPY --chown=quarkus:quarkus build.gradle /code/ COPY --chown=quarkus:quarkus settings.gradle /code/ COPY --chown=quarkus:quarkus gradle.properties /code/ USER quarkus WORKDIR /code COPY src /code/src RUN ./gradlew -b /code/build.gradle buildNative
3. 先以root用户处理权限再切换用户
避免--chown指令干扰权限继承,先以root用户复制文件、设置权限,再切换到quarkus用户:
FROM quay.io/quarkus/ubi-quarkus-native-image:21.3.1-java11 AS build COPY gradlew /code/gradlew COPY gradle /code/gradle COPY build.gradle /code/ COPY settings.gradle /code/ COPY gradle.properties /code/ # 设置权限并修改所有者 RUN chmod +x /code/gradlew && chown -R quarkus:quarkus /code USER quarkus WORKDIR /code COPY src /code/src RUN ./gradlew -b /code/build.gradle buildNative
4. 确保Git仓库中gradlew的权限正确
本地项目中先给gradlew添加可执行权限,再推送到GitLab,确保Runner拉取代码后文件权限保留:
chmod +x gradlew git add gradlew git commit -m "Fix gradlew executable permission" git push
内容的提问来源于stack exchange,提问作者SirHawrk
相关产品推荐
相关产品推荐

