2017-10-17 142 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