【问题标题】:Build gradle project inside a Docker在 Docker 中构建 gradle 项目
【发布时间】:2018-03-29 06:44:02
【问题描述】:

我有一个简单的 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

【问题讨论】:

  • 查看 gradle:4.2.1-jdk8-alpine github.com/keeganwitt/docker-gradle/blob/… 的 docker 文件。它设置用户“gradle”。您从应用程序目录复制到 docker 映像的应用程序目录的文件可能没有“gradle”用户的正确权限。现在 RUN chmod 不起作用,因为该命令在 docker 上下文中再次以“gradle”用户身份运行。因此,您必须在本地终端上运行“chown -R nobody:nobody /path/to/app/myProject”,然后构建 docker 映像。
  • @Cyclops 感谢您的评论。本地终端是什么意思?我不能在我的 Dockerfile 中自动化它吗?
  • 您可以在 dockerfile 中添加以下 3 个命令:-------- 1. USER root # 这会将默认用户更改为 root 2. RUN chown -R gradle /app # 这会更改所有权of folder 3. USER gradle #这会将用户更改回默认用户“gradle”
  • 忘记添加一件事了。这 3 行将位于 docker 文件中的 COPY 命令下方。让我知道这是否适合您。我过去曾遇到过关于文件和文件夹所有权问题的类似问题。我已经以类似的方式解决了它们。
  • @Cyclops 它正在工作。贴出来作为答案,我会接受的!

标签: docker gradle build.gradle file-permissions


【解决方案1】:

根据Dockerfile for gradle:4.2.1-jdk8-alpine at ,它的默认用户是“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

【讨论】:

    【解决方案2】:

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

    FROM gradle:4.2.1-jdk8-alpine
    WORKDIR /app
    ADD --chown=gradle:gradle /app/myProject /app
    
    RUN ./gradlew build --stacktrace
    

    【讨论】:

    猜你喜欢
    • 2017-01-19
    • 2020-05-16
    • 1970-01-01
    • 2015-04-26
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2023-03-03
    相关资源
    最近更新 更多