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
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
別のオプションは、ADD
の代わりにCOPY
コマンドを使用して、それを--chown
オプションは、コピー後にファイルの所有者を変更します。したがって、最終的なDockerfileはさらに単純になります。
FROM gradle:4.2.1-jdk8-Alpine
WORKDIR /app
ADD --chown=gradle:gradle /app/myProject /app
RUN ./gradlew build --stacktrace