Google jib - 更改所有文件和文件夹的所有者

Google jib - Change owner of all files and folders

所有应用程序文件和 extraDirectories 都归 root 所有。

/app/libs/
/app/resources/ 
/app/classes/
/app/logs

我想 运行 应用程序作为非 root 用户,我希望这些 files/folders 仅由该用户拥有,而不是 root。

有什么办法吗?我发现下面提到的 jib maven 插件可以更改所有者,但建议不要这样做。有没有更好的方法?

https://github.com/GoogleContainerTools/jib-extensions/tree/master/first-party/jib-ownership-extension-maven

您想要更改应用目录某些部分的所有权的原因是您的应用想要在运行时修改某些文件或在其中创建新文件。一般来说,尽可能构建不可变的镜像被认为是一种很好的做法。

既然你提到了 /app/logs,我怀疑你的应用程序在 运行 时生成了日志文件。在一些现代容器编排平台(如 Kubernetes)上,应用程序通常设计为 output logs to stdout and stderr.

The best practice is to write your application logs to the standard output (stdout) and standard error (stderr) streams.

想一想:如果您的应用程序在容器内的 /app/logs 处生成日志文件(会有多个容器具有相同的图像 运行),您将如何在一个容器中收集和监控它们统一方式?如果不同的应用程序在不同的文件系统位置生成日志文件怎么办?但更重要的是,如果您的容器崩溃,您只会丢失日志文件。通过将日志写入 stdoutstderr,平台(例如 Kubernetes)将负责管理和关联来自所有 pods.

的日志的所有复杂性

如果您无法更改有关日志文件的应用程序,至少您应该在运行时在 /app/logs 处安装一个卷。对于任何容器运行时(无论是 k8s 还是 Docker),这都很容易配置。挂载的目录通常是全局可写的,因此您不需要更改所有权。但是您仍然需要考虑如何收集和管理日志文件。

同样,如果不是用于日志文件,而是您的应用程序需要一个文件系统来在应用程序目录中创建一个临时文件,并且由于某种原因您不能更改位置,至少您应该尝试挂载一个临时文件在回退到使用您提到的 Jib Ownership Extension 的最后手段之前。

最后,请仔细评估您必须首先更改所有权的原因。如果应用程序想要在运行时改变自身,通常这不是容器化的好做法,并且必须有一些根本原因,您可能需要以适当的方式解决。