You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node Alpine Docker环境下Oracle厚模式连接遇ORA-24960错误排查

问题

在Node.js 20.11.1 Alpine Docker镜像中部署Oracle Instant Client 23.4后,按照node-oracledb官方文档启用厚模式(调用initOracleClient())时,出现ORA-24960错误:OCI_ATTR_PASSWORD属性超出1024字符的最大允许长度。但不调用initOracleClient()时,数据库连接可正常建立。相关配置文件及日志信息如下:

Dockerfile

FROM node:20.11.1-alpine AS alpine

RUN apk add --no-cache \
    tzdata libaio libnsl libc6-compat 
 
COPY ./src/instantclient-basiclite-linux.x64-23.4.0.24.05.zip /tmp/instantclient-basiclite.zip
WORKDIR /tmp
RUN unzip instantclient-basiclite.zip
RUN mv instantclient*/ /usr/lib/instantclient && \
    rm instantclient-basiclite.zip && \
    ln -s /usr/lib/instantclient/libclntsh.so.23.1 /usr/lib/libclntsh.so && \
    ln -s /usr/lib/instantclient/libclntshcore.so.23.1 /usr/lib/libclntshcore.so && \
    ln -s /usr/lib/instantclient/libocci.so.23.1 /usr/lib/libocci.so && \
    ln -s /usr/lib/instantclient/libociicus.so /usr/lib/libociicus.so && \
    ln -s /usr/lib/instantclient/libnnz.so /usr/lib/libnnz.so && \
    ln -s /usr/lib/libnsl.so.2 /usr/lib/libnsl.so.1 && \
    ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2 && \
    ln -s /lib64/ld-linux-x86-64.so.2 /usr/lib/ld-linux-x86-64.so.2

ENV DPI_DEBUG_LEVEL 64 
ENV LD_LIBRARY_PATH /usr/lib/instantclient

WORKDIR /app

# Define the command to run the application
CMD ["node", "index.js >2 log.txt"]

index.js

const oracledb = require("oracledb");

oracledb.initOracleClient();
const connection = await oracledb.getConnection({
   user: "system",
   password: "test123",
   connectString : "localhost:1521/FREEPDB1"
});
console.log('ORACLEDB connection() END', connection);

日志信息

ODPI [00214] 2024-10-04 03:21:55.014: module name is /app/node_modules/.pnpm/oracledb@6.6.0/node_modules/oracledb/build/Release/oracledb-6.6.0-linux-x64.node
ODPI [00214] 2024-10-04 03:21:55.014: load in dir /app/node_modules/.pnpm/oracledb@6.6.0/node_modules/oracledb/build/Release
ODPI [00214] 2024-10-04 03:21:55.014: load with name /app/node_modules/.pnpm/oracledb@6.6.0/node_modules/oracledb/build/Release/libclntsh.so
ODPI [00214] 2024-10-04 03:21:55.014: load by OS failure: Error loading shared library /app/node_modules/.pnpm/oracledb@6.6.0/node_modules/oracledb/build/Release/libclntsh.so: No such file or directory
ODPI [00214] 2024-10-04 03:21:55.014: load with OS search heuristics
ODPI [00214] 2024-10-04 03:21:55.014: load with name libclntsh.so
ODPI [00214] 2024-10-04 03:21:55.027: load by OS successful
ODPI [00214] 2024-10-04 03:21:55.027: validating loaded library
AppDataSource error [Error: ORA-24960: the attribute  OCI_ATTR_PASSWORD is greater than the maximum allowable length of 1024
Help: https://docs.oracle.com/error-help/db/ora-24960/] {
  errorNum: 24960,
  offset: 0,
  code: 'ORA-24960'
}

解答

这个错误并非密码长度真的超标,而是Alpine系统的libc6-compat与Oracle Instant Client厚模式的兼容性问题导致内存读取异常,进而误判密码长度。可通过以下方式解决:

方案1:显式指定客户端库路径

调用initOracleClient时传入libDir参数,明确指定Oracle客户端库位置,避免系统库的兼容性干扰:

oracledb.initOracleClient({ libDir: '/usr/lib/instantclient' });

方案2:修正Docker启动命令

原CMD中的重定向写法有误,且可能导致环境变量传递异常,修改为:

CMD ["sh", "-c", "LD_LIBRARY_PATH=/usr/lib/instantclient node index.js > log.txt 2>&1"]

方案3:更换基础镜像

若上述方案无效,可直接使用基于glibc的Node.js镜像(如node:20.11.1-slim)替代Alpine镜像,从根源上解决musl libc与Oracle客户端的兼容性问题。

内容的提问来源于stack exchange,提问作者user27619095

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:07:33