Создайте проект Gradle внутри 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


person Sergii Bishyr    schedule 17.10.2017    source источник
comment
Взгляните на файл докера для gradle: 4.2.1-jdk8-alpine github.com/keeganwitt/docker-gradle/blob/. Он устанавливает USER gradle. Файлы, которые вы копируете из каталога приложения в каталог приложения образа докера, могут не иметь необходимых разрешений для пользователя Gradle. Теперь RUN chmod не работает, потому что эта команда снова запускается как пользователь gradle внутри контекста докера. Итак, вам нужно запустить chown -R nobody: nobody / path / to / app / myProject на вашем локальном терминале, а затем создать образ докера.   -  person Raghwendra Singh    schedule 18.10.2017
comment
@Cyclops спасибо за комментарий. Что вы имеете в виду под локальным терминалом? Разве я не могу автоматизировать это в моем Dockerfile?   -  person Sergii Bishyr    schedule 18.10.2017
comment
Вы можете добавить следующие 3 команды в свой файл докеров: -------- 1. USER root # Это изменяет пользователя по умолчанию на root 2. RUN chown -R gradle / app # Это меняет владельца папки 3. USER gradle # Это изменяет пользователя обратно на пользовательский градиент по умолчанию   -  person Raghwendra Singh    schedule 18.10.2017
comment
Забыл добавить еще кое-что. Эти 3 строки будут располагаться под командой COPY в вашем файле докеров. Сообщите мне, работает ли это для вас. В прошлом я сталкивался с подобными проблемами, связанными с проблемами владения файлами и папками. Я решил их аналогичным образом.   -  person Raghwendra Singh    schedule 18.10.2017
comment
@Cyclops работает. Отправьте как ответ, я приму!   -  person Sergii Bishyr    schedule 19.10.2017


Ответы (2)



Другой вариант - использовать команду ADD вместо COPY, а затем использовать ее --chown, чтобы изменить владельца файла после копирования. Так что окончательный Dockerfile будет еще проще.

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 также поддерживает параметр --chown, см. docs.docker.com/engine/reference/builder / # копия - person Peter Dotchev; 25.09.2019