我相信你说的是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
因此,您只需确保以用户 1000 或 gradle 的身份运行容器(在您使用的任何容器运行时环境中)。并且由于镜像gradle:4.6被配置为以1000运行,当你基于gradle:4.6构建一个新镜像时,它应该在几乎所有容器运行时平台上运行正常(除非你在平台级别覆盖配置的用户) .
(现在,以下假设您正在使用 Jib 基于 gradle:4.6 构建另一个类似 Gradle 的镜像,并且您正在 Kubernetes 上使用这个新的类似 Gradle 的镜像。也就是说,以下内容不适用您正在使用 Jib 在 gradle:4.6 中容器化一个普通的应用程序映像。)
但是,有一个bug in 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: 1000 and 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)