2017-10-17 1 views
1

Ich habe ein einfaches Projekt grdle, die ich in den Docker ContainerBuild gradle Projekt in einem Docker

bauen Ich habe eine mehrstufige Docker bauen. Die erste Phase klon das Projekt von Github. Die zweite Phase muss das Projekt aufbauen, damit ich es in der Endphase ausführen kann. Aber es funktioniert nicht auf in

FROM gradle:4.2.1-jdk8-alpine 
WORKDIR /app 
COPY --from=0 /app/myProject /app 
RUN ./gradlew build --stacktrace 

Der Befehl ./gradlew build --stacktrace nicht ausgeführt und schlägt mit dem Fehler werden kann:

FAILURE: Build failed with an exception. 

* What went wrong: 
Could not update /app/.gradle/3.5-rc-2/file-changes/last-build.bin 

und die Stacktrace:

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) 
...... 

Warum die Docker Benutzer nicht Berechtigung zum Erstellen einer Datei im Arbeitsverzeichnis und zum Hinzufügen dieser Berechtigungen? Einfache RUN chmod 777 /app funktioniert nicht und sagt mir: chmod: /app: Operation not permitted

+0

Werfen Sie einen Blick auf die Docker-Datei für gradle: 4.2.1-jdk8 alpinen https://github.com/

Sie sollten die richtigen Berechtigungen für die Einstellung drei zusätzliche Befehle in Ihrem Dockerfile hinzufügen keeganwitt/docker-gradle/Blob/2d38bdd0ca754b0ee54ad29a483778fd84bfcbe4/jdk8 alpinen/Dockerfile. Es setzt USER "Gradle". Die Dateien, die Sie aus Ihrem Anwendungsverzeichnis in das Anwendungsverzeichnis von docker image kopieren, verfügen möglicherweise nicht über die richtigen Berechtigungen für den Benutzer "gradle". Jetzt funktioniert RUN chmod nicht, weil dieser Befehl ausgeführt wird, als wäre er wieder ein "grandle" Benutzer im Docker Kontext. Sie müssen also "chown -R niemand: niemand/Pfad/zu/app/myProject" auf Ihrem lokalen Terminal ausführen und dann das Docker-Image erstellen. – Cyclops

+0

@Cyclops danke für den Kommentar. Was meinst du mit lokalen Terminal? Kann ich es nicht in meiner Dockerfile automatisieren? –

+1

Sie können die folgenden 3 Befehle in Ihrer Docker-Datei hinzufügen: -------- 1. USER root # Dies ändert den Standardbenutzer auf root 2. RUN chown -Rgradle/app # Dies ändert Besitz des Ordners 3 Benutzer GRADLE # Dies ändert den Benutzer wieder auf den Standardbenutzer "GRADLE" – Cyclops

Antwort

1

Nach dem Dockerfile für gradle: 4.2.1-jdk8 alpinen bei, es „gradle“ als Standard-Benutzer hat. Die Dateien, die Sie aus Ihrem Anwendungsverzeichnis in das Anwendungsverzeichnis von docker image kopieren, verfügen möglicherweise nicht über die richtigen Berechtigungen für den Benutzer "gradle".

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