Gradle как не root - PullRequest
       51

Gradle как не root

2 голосов
/ 28 апреля 2020

Не могли бы вы дать мне знать, как запустить образ gradle (извлечен из репозитория docker), с плагином jib и работать как пользователь не-root в Kubernetes pod?

Я создал gradle изображение, используя Gradle 4.6.

Я использую это изображение в своем Kubernetes pod.

Когда я запускаю образ от имени пользователя - root, сборка gradle прошла успешно.

Когда я запускаю образ от имени пользователя root (из-за включения pod RBAC), сборка завершается неудачно, так как gradle не может создать каталог /.gradle и нет достаточных привилегий и получения ошибка ниже.

Не удалось загрузить собственную библиотеку 'libnative-platform.so' для Linux amd64.

Есть ли способ предоставить не- root пользователь прошел через securityContext, чтобы успешно выполнить сборку с использованием образа gradle?

Есть ли лучший способ решения проблемы без изменения разрешения каталога на 777.

Заранее спасибо !!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Скорее всего, причина в том, что каталог /.gradle уже создан root

Итак, если вы проверите владельца с помощью команды stat.

Вы увидите у данного пользователя недостаточно прав для работы с ним:

$ stat ~/.gradle | grep Uid
> Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)

Если это так, смените владельца каталога:

$ sudo chown -R $USER ~/.gradle

Где

  • -R означает рекурсивное обновление владельца
  • $USER содержит текущее имя пользователя
0 голосов
/ 28 апреля 2020

Полагаю, вы говорите об официальном Gradle образе на Docker Hub.

Образ gradle:4.6 разработан и предназначен для запуска от имени пользователя gradle (UID 1000).

$ docker inspect gradle:4.6 --format '{{.Config.User}}'
gradle
$ docker run --rm --entrypoint id gradle:4.6
uid=1000(gradle) gid=1000(gradle) groups=1000(gradle)

Поэтому он работает только при запуске образа от имени пользователя root (UID 0) или gradle (UID 1000).

# These all work.
$ docker run --rm --user 0 gradle:4.6
$ docker run --rm --user root gradle:4.6
$ docker run --rm --user 1000 gradle:4.6
$ docker run --rm --user gradle gradle:4.6

# However, this doesn't work.
$ docker run --rm --user 1234 gradle:4.6

FAILURE: Build failed with an exception.

* What went wrong:
Failed to load native library 'libnative-platform.so' for Linux amd64.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Следовательно, вам просто нужно убедиться, что вы запускаете контейнер как пользователь 1000 или gradle (в любой среде выполнения контейнера, которую вы используете). И поскольку образ gradle:4.6 настроен для работы с 1000, при создании нового образа на основе gradle:4.6 он должен работать нормально почти на всех платформах среды выполнения контейнера (если вы не переопределите настроенного пользователя на уровне платформы) .


(Теперь следующее предполагает, что вы используете Jib для создания другого Gradle-подобного изображения на основе gradle:4.6 и что вы используете это новое Gradle-подобное изображение в Kubernetes. следующее не применяется, если вы используете Jib для контейнерирования обычного образа приложения внутри gradle:4.6.)

Однако в Jib есть ошибка , которая не наследует настроенного пользователя из базового изображения. Ошибка будет исправлена ​​в следующем выпуске 2.3.0. В то же время вы можете явно указать Jib настроить пользователя во встроенном образе. В build.gradle установите

jib.container.user = 'gradle:gradle'

или, если вы предпочитаете цифры c UID и GID,

jib.container.user = '1000:1000'

. Или вы можете установить системное свойство в командной строке:

./gradlew -Djib.container.user='gradle:gradle' ... jib

Другой вариант - установить правильного пользователя на стороне Kubernetes. Например, в securityContext вы можете установить runAsUser: 1000 и runAsGroup: 1000.

Наконец, хотя gradle:4.6 создан для работы в качестве пользователя gradle (UID 1000) Я вижу, что недавно они отменили это решение. Теперь gradle:latest настроен для работы как root.

$ docker run --rm --entrypoint id gradle
uid=0(root) gid=0(root) groups=0(root)
...