我相信你说的是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 的镜像,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: 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)