oracle版本:11.2.0.4.0
下载oracle客户端
https://download.oracle.com/otn/linux/instantclient/11204/instantclient-sdk-linux.x64-11.2.0.4.0.zip 将两个压缩包加压到/instantclient_11_2目录中
安装需要的依赖
apk add --no-cache libnsl libaio pkgconfig gcc musl-dev libc6-compat
使用go-coi8包进行连接oracle数据库
安装pkg-config
apk add pkgconfig
配置环境变量
ORACLE_HOME="/instantclient_11_2" \
TNS_ADMIN="/instantclient_11_2/network/admin" \
GOROOT="/usr/local/go" \
PATH="$PATH:/usr/local/go/bin" \
PKG_CONFIG_PATH="/"
依赖glibc,所以需要在alpine安装glic
Releases · sgerrand/alpine-pkg-glibc · GitHub
下载glibc 需要glibc-2.35-r0.apk glibc-bin-2.35-r0.apk glibc-dev-2.35-r0.apk
PKG_CONFIG_PATH是pkg-config的配置文件路径,编写oci8.pc文件
prefix=/instantclient_11_2
libdir=${prefix}
includedir=${prefix}/sdk/include/
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: oci8
Description: oci8 library
Libs: -L/usr/glibc-compat/lib -L${libdir} -lclntsh
Cflags: -I${includedir}
Version: 12.2
需要添加动态链接库的位置到ld配置文件
echo -e '/instantclient_11_2\n/usr/glibc-compat/lib\n/usr/lib\n/lib' > /etc/ld.so.conf && \
ldconfig
alpine的连接器/lib/ld-musl-x86_64.so.1 和glibc中的/usr/glibc-compat/lib/ld-linux-x86-64.so.2连接器不兼容无法直接使用glibc中的连接器
编译时需要使用glibc中的动态连接器构建项目
/usr/glibc-compat/lib/ld-linux-x86-64.so.2 /usr/local/go/bin/go build
执行也需要使用glibc中的链接器
/usr/glibc-compat/lib/ld-linux-x86-64.so.2 ./oracle-test user/name@host:port/sid
运行需要添加环境变量
LD_LIBRARY_PATH /lib:/usr/lib:$ORACLE_HOME
附上alpine客户端的dockerfile
FROM alpine:3.16.2
LABEL maintainer="f1474240856@163.com"
ADD instantclient-basic-linux.x64-11.2.0.4.0.zip glibc-2.35-r0.apk /
CMD ["/bin/sh"]
ENV LANG=C.UTF-8
ENV ORACLE_HOME /instantclient_11_2
ENV TNS_ADMIN $ORACLE_HOME/network/admin
ENV LD_LIBRARY_PATH /lib:/usr/lib:$ORACLE_HOME
RUN apk add --no-cache libaio libnsl unzip && unzip instantclient-basic-linux.x64-11.2.0.4.0.zip && apk del unzip && rm -f instantclient-basic-linux.x64-11.2.0.4.0.zip
有想过使用静态连接编译客户端,查到资料应该是不支持使用静态链接编译的
Issues Affecting Linux for Oracle Database 18c
不太会发长文请见谅,有什么需要指正的欢迎评论或者私信我