我有一个基于(在 ubuntu:latest 的 docker 容器中)构建的二进制文件,ubuntu 20
如果我想运行这个二进制文件,例如在 中,该怎么办ubuntu 16
?
我知道可能会面临这样一个事实:libc.so
ubuntu 16 中的版本与 ubuntu 20 中的版本不兼容libc.so
,二进制文件已链接到,并且我会在运行时收到类似GLIBC symbols is not found
.
在这种情况下,最佳做法是什么?不考虑与系统库的静态链接以及在每个目标平台上的构建。
如何从构建平台向目标平台提供所有系统共享库(libc
、libpthread
等)?ld.so
我在 ubuntu 16 中运行的应用程序将使用libc
与之链接的 ubuntu 20。 (例如,我将指定所需libc
via的路径)LD_LIBRARY_PATH
采用这种方法我会面临哪些问题?
答案1
尝试提供在旧发行版中运行“新”二进制文件所需的一切最终会变得复杂且有些脆弱;如果您有兴趣,请查看 Steam 运行时或 Flatpak 运行时。对于整个生态系统来说,这可以说是值得的,但我认为对于单个二进制文件来说,这需要付出太多的努力。
由于您已经拥有能够构建二进制文件的容器描述符,因此我建议针对所有目标发行版进行调整;这样您就可以构建在任何地方都具有正确依赖项的二进制文件,并且您将在用户发现之前知道是否需要调整依赖项。
还有其他选择,不一定是排他性的。
您可以选择在容器映像中提供二进制文件。如果容器构建良好,则开销可以减少到最低限度 - 实际上,为二进制文件提供所需的运行时所需的开销,因此相当于您现在正在考虑的选项,并且远没有那么脆弱。
另一个需要考虑的选择是静态构建二进制文件,或者基于最小公分母(例如RHEL 7)。您可能会遇到新发行版上旧依赖项的可用性问题,但这些问题通常可以通过比第一种方法更好的方式解决。