web-dev-qa-db-ja.com

Docker内でGradleプロジェクトをビルドする

Dockerコンテナー内でビルドする簡単なGradleプロジェクトがあります

マルチステージのDockerビルドがあります。最初の段階では、githubからプロジェクトを複製します。第2段階では、プロジェクトをビルドして、最終段階で実行できるようにする必要があります。しかし、それは失敗します

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

5
Sergii Bishyr

Dockerfile for gradle:4.2.1-jdk8-Alpine atによると、デフォルトのユーザーとして " gradle "を持っています。アプリディレクトリからdocker imageのアプリディレクトリにコピーするファイルには、「gradle」ユーザーに適切な権限がない可能性があります。

正しい権限を設定するには、Dockerfileに3つのコマンドを追加する必要があります。

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
11
Cyclops

別のオプションは、ADDの代わりにCOPYコマンドを使用して、それを--chownオプションは、コピー後にファイルの所有者を変更します。したがって、最終的なDockerfileはさらに単純になります。

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

RUN ./gradlew build --stacktrace
6
zaerymoghaddam