在 Docker 中构建 gradle 项目

Build gradle project inside a Docker

我有一个简单的 gradle 项目,我想在 Docker 容器中构建它

我有一个多阶段 docker 构建。第一阶段只是从 github 克隆项目。第二阶段必须构建项目,这样我才能在最后阶段 运行 它。但它在

上失败了
FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app
RUN ./gradlew build --stacktrace

命令 ./gradlew build --stacktrace 无法执行并失败并出现错误:

FAILURE: Build failed with an exception.

* What went wrong:
Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin

和堆栈跟踪:

org.gradle.api.UncheckedIOException: Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin
    at org.gradle.api.internal.changedetection.state.FileTimeStampInspector.updateOnFinishBuild(FileTimeStampInspector.java:72)
    at org.gradle.api.internal.changedetection.state.BuildScopeFileTimeStampInspector.stop(BuildScopeFileTimeStampInspector.java:38)
    at org.gradle.internal.concurrent.CompositeStoppable.stop(CompositeStoppable.java:98)
.....
Caused by: java.io.FileNotFoundException: /app/.gradle/3.5-rc-2/file-changes/last-build.bin (Permission denied)
    at java.io.FileOutputStream.open0(Native Method)
......

为什么docker用户没有在工作目录中创建文件的权限以及如何添加这些权限? 简单 RUN chmod 777 /app 不起作用并告诉我:chmod: /app: Operation not permitted

根据 Dockerfile for gradle:4.2.1-jdk8-alpine at , it has "gradle" 作为其默认用户。您从应用程序目录复制到 docker 图片应用程序目录的文件可能没有 "gradle" 用户的正确权限.

您应该在 Dockerfile 中添加三个额外的命令来设置正确的权限:

FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
COPY --from=0 /app/myProject /app

USER root                # This changes default user to root
RUN chown -R gradle /app # This changes ownership of folder
USER gradle              # This changes the user back to the default user "gradle"

RUN ./gradlew build --stacktrace

另一种选择是使用 ADD 命令代替 COPY,然后使用它的 --chown 选项在复制后更改文件的所有者。所以最终的 Dockerfile 会更简单。

FROM gradle:4.2.1-jdk8-alpine
WORKDIR /app
ADD --chown=gradle:gradle /app/myProject /app

RUN ./gradlew build --stacktrace