Bangun proyek gradle di dalam Docker

Saya memiliki proyek gradle sederhana yang ingin saya bangun di dalam wadah Docker

Saya memiliki build buruh pelabuhan multistage. Tahap pertama tinggal clone proyek dari github. Tahap kedua harus membangun proyek agar saya bisa menjalankannya di tahap akhir. Tapi gagal di dalam

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

Perintah ./gradlew build --stacktrace tidak dapat dijalankan dan gagal dengan kesalahan:

FAILURE: Build failed with an exception.

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

Dan pelacakan tumpukan:

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

Mengapa pengguna buruh pelabuhan tidak memiliki izin untuk membuat file di direktori kerja dan bagaimana cara menambahkan izin ini? Sederhana RUN chmod 777 /app tidak berfungsi dan memberi tahu saya: chmod: /app: Operation not permitted


person Sergii Bishyr    schedule 17.10.2017    source sumber
comment
Lihat file buruh pelabuhan untuk gradle:4.2.1-jdk8-alpine github.com/keeganwitt/docker-gradle/blob/. Ini menetapkan nilai USER. File yang Anda salin dari direktori aplikasi ke direktori aplikasi gambar buruh pelabuhan mungkin tidak memiliki izin yang tepat untuk pengguna gradle. Sekarang RUN chmod tidak berfungsi karena perintah itu dijalankan lagi sebagai pengguna gradle dalam konteks buruh pelabuhan. Jadi, Anda harus menjalankan chown -R none:nobody /path/to/app/myProject di terminal lokal Anda dan kemudian membuat image buruh pelabuhan.   -  person Raghwendra Singh    schedule 18.10.2017
comment
@Cyclops terima kasih atas komentarnya. Apakah yang Anda maksud: terminal lokal Tidak bisakah saya mengotomatiskannya di Dockerfile saya?   -  person Sergii Bishyr    schedule 18.10.2017
comment
Anda dapat menambahkan 3 perintah berikut di dockerfile Anda: -------- 1. USER root # Ini mengubah pengguna default menjadi root 2. RUN chown -R gradle /app # Ini mengubah kepemilikan folder 3. USER gradle # Ini mengubah pengguna kembali ke tingkat pengguna default   -  person Raghwendra Singh    schedule 18.10.2017
comment
Lupa menambahkan satu hal lagi. 3 baris ini akan berada di bawah perintah COPY di file buruh pelabuhan Anda. Beri tahu saya jika ini berhasil untuk Anda. Saya pernah menghadapi masalah serupa di masa lalu terkait masalah kepemilikan file dan folder. Saya telah menyelesaikannya dengan cara yang sama.   -  person Raghwendra Singh    schedule 18.10.2017
comment
@Cyclops itu berhasil. Posting itu sebagai jawaban, saya akan menerimanya!   -  person Sergii Bishyr    schedule 19.10.2017


Jawaban (2)


Menurut Dockerfile untuk gradle:4.2.1- jdk8-alpine di , ia memiliki "gradle " sebagai pengguna defaultnya. File yang Anda salin dari direktori aplikasi ke direktori aplikasi gambar buruh pelabuhan mungkin tidak memiliki izin yang tepat untuk pengguna "gradle".

Anda harus menambahkan tiga perintah tambahan di Dockerfile Anda untuk mengatur izin yang benar:

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
person Raghwendra Singh    schedule 21.10.2017

Pilihan lainnya adalah menggunakan perintah ADD alih-alih COPY dan kemudian menggunakan opsi --chown untuk mengubah pemilik file setelah disalin. Jadi Dockerfile terakhir akan lebih sederhana.

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

RUN ./gradlew build --stacktrace
person zaerymoghaddam    schedule 22.03.2019
comment
COPY juga mendukung opsi --chown, lihat docs.docker.com/engine/reference/builder /#salin - person Peter Dotchev; 25.09.2019