3

您能否让我知道如何使用插件运行gradle图像(从docker存储库中提取)并以非用户身份运行?jibrootKubernetes pod

我已经gradle使用Gradle 4.6.

我在我的Kubernetes pod.

当我以 user - 身份运行图像时rootgradle构建成功。

当我以非root用户身份运行映像时(由于pod RBAC启用),构建失败,因为gradle无法创建/.gradle目录并且没有足够的权限并出现以下错误。

无法为 Linux amd64 加载本机库“libnative-platform.so”。

有没有办法让root通过的非用户securityContext使用图像成功执行构建gradle

有没有更好的方法来解决问题而无需将目录权限更改为777.

提前致谢!!

4

2 回答 2

1

最有可能的原因是该/.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包含当前用户名
于 2020-04-28T17:22:08.090 回答
0

我相信你说的是Docker Hub 上的官方Gradle镜像。

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

因此,您只需要确保以用户身份1000gradle(在您使用的任何容器运行时环境上)运行容器。并且由于镜像gradle:4.6被配置为运行1000,当你基于 构建新镜像时gradle:4.6,它应该在几乎所有容器运行时平台上运行正常(除非你在平台级别覆盖配置的用户)。


(现在,以下假设您正在使用 Jib 构建另一个类似 Gradle 的镜像,gradle:4.6并且您正在 Kubernetes 上使用这个新的类似 Gradle 的镜像。也就是说,如果您使用 Jib 进行容器化,则以下内容不适用里面有一个普通的应用程序图像gradle:4.6。)

但是,Jib中存在一个错误,它不会从基本映像继承配置的用户。该错误将在下一个 2.3.0 版本中修复。同时,您可以明确告诉 Jib 在构建的映像中配置用户。在build.gradle, 集

jib.container.user = 'gradle:gradle'

或者,如果您更喜欢数字 UID 和 GID,

jib.container.user = '1000:1000'

. 或者您可以在命令行上设置系统属性:

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

另一种选择是在 Kubernetes 端设置正确的用户。例如,在 内securityContext,您可以设置runAsUser: 1000runAsGroup: 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)
于 2020-04-28T19:58:03.980 回答