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
相关产品推荐
相关产品推荐

