我在尝试在 Alpine docker 中使用 C++ 编译(更准确地说,链接)OCCI 程序时遇到一些问题。 我已经按照这个问题中的一些步骤安装了 Instant Client 21.14,并且已经创建了符号链接并设置了环境变量。 当我尝试链接如下所示的简单 C++ 程序时,我的问题就出现了:
g++ -o oracleclient OracleClient2.o -L"$ORACLE_HOME" -locci -lclntsh
/// Or
g++ -o oracleclient OracleClient2.o -L"$ORACLE_HOME" -locci_gcc53 -lclntsh
此编译步骤在 Ubuntu 中有效,但在 Alpine 中我遇到很多链接错误,其中一些是:
ld: warning: libdl.so.2, needed by /usr/lib/instantclient/libocci_gcc53.so, not found (try using -rpath or -rpath-link)
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `sigfillset@GLIBC_2.2.5'
ld: /usr/lib/instantclient/libocci_gcc53.so: undefined reference to `operator new(unsigned long)@GLIBCXX_3.4'
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `sigprocmask@GLIBC_2.2.5'
ld: /usr/lib/instantclient/libclntsh.so: undefined reference to `pthread_cond_timedwait@GLIBC_2.3.2'
ld: /usr/lib/instantclient/libclntshcore.so.21.1: undefined reference to `pthread_attr_setschedpolicy@GLIBC_2.2.5'
首先,我不知道如何在Alpine中安装libdl.so.2,第二个问题是,据我了解,Alpine使用musl-libc,而Oracle共享库使用glibc,因此它们不兼容。 已经尝试安装 gcompat 但它没有解决我的问题。
如有任何帮助,我们将不胜感激。
我尝试在 Alpine docker 中链接并执行 OCCI C++ 应用程序,但显然 Instant Client 的共享库与 Alpine 不兼容。
使 Alpine Linux 设置更小的原因之一是使用备用系统 C 库(musl libc 而不是 GNU libc)。 您看到的一些库(如
libdl.so.2
)是核心 C 库的一部分。 很难更换。
如果您看到引用其中一些系统库的链接错误,或明确引用
symbolname@GLIBC_...
版本标记,那么您的应用程序可能根本无法在 Alpine 上运行。 几乎所有其他 Linux 发行版(包括 Debian、Ubuntu 和 RHEL)都基于 GNU libc,并且在其他发行版上不会出现这些链接错误。
有一些关于“运行 glibc 程序”的 Alpine 文档,但它们很大程度上归结为复杂的模拟层。 该页面最终开始讨论使用 chroot 环境和容器作为在基于 Alpine 的环境中运行需要 GNU libc 的程序的好方法,此时您实际上不再使用基本的 Alpine 容器。 因此,我会将您的映像更改为基于另一个 Linux 发行版,例如
FROM debian:bookworm AS build
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive \
apt-get install --assume-yes --no-install-recommends \
build-essential
...
RUN g++ -o oracleclient OracleClient2.o -L/opt/oracle/lib -locci -lclntsh
FROM debian:bookworm
...
COPY --from=build /app/oracleclient /usr/local/lib
CMD ["oracleclient"]