2017-10-17 215 views
1

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

我有一个多阶段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) 
...... 

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

+0

看一看的gradle为泊坞窗文件:4.2.1-jdk8高山https://github.com/ keeganwitt /泊坞窗,gradle产出/ BLOB/2d38bdd0ca754b0ee54ad29a483778fd84bfcbe4/jdk8高山/ Dockerfile。它设置USER“gradle”。您从app目录复制到docker image的app目录的文件可能没有“gradle”用户的权限。现在,RUN chmod不起作用,因为该命令在Docker上下文中再次作为“gradle”用户运行。因此,您必须在本地终端上运行“chown -R nobody:nobody/path/to/app/myProject”,然后构建泊坞窗图像。 – Cyclops

+0

@Cyclops感谢您的评论。本地终端是什么意思?我不能在Dockerfile中自动执行它吗? –

+1

您可以在您的dockerfile中添加以下3个命令: -------- 1. USER root#这会将默认用户更改为root 2. RUN chown -R gradle/app#这会更改文件夹的所有权 3 。用户gradle#这会将用户更改回默认用户“gradle” – Cyclops

回答

1

按照Dockerfile的gradle为:4.2.1-jdk8高山的,它具有“gradle”作为其默认的用户。您从app目录复制到docker image的app目录的文件可能没有“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