[TroubleShooting] DPI-1047: Cannot locate a 64-bit Oracle Client library

2024. 4. 24. 16:30IT/docker

반응형

[TroubleShooting]

1. 상황

도커로 node 프로젝트를 띄우려는 상황에서 Oracle Client 연동 에러 발생.

DPI-1047: Cannot locate a 64-bit Oracle Client library

libclntsh .so cannot open shared object file no such file or directory

libnnz21.so cannot open shared object file no such file or directory

 해결 과정에서 위와 같은 에러 발생

(DPI-1047: Cannot locate a 64-bit Oracle Client library)

libclntsh .so cannot open shared object file no such file or directory

-> 권한 문제가 아닌 디렉토리 설정을 잘못한 것으로 파악(해당 파일은 존재)

1. 리눅스용 클라이언트인지 파악 (윈도우용과 파일이 다름)

2. dockerfile에  RUN pwd, RUN ls -al 코드를 찍어 해당 파일의 위치 파악

 

FROM centos:8 AS builder

WORKDIR /app

COPY . .
RUN pwd
RUN ls -al

# Step 2
## base image for Step 2: Node 20.11.0
FROM node:20.11.0
.
.
.
.
.
생략

3.   oracledb.initOracleClient()

위 함수에 확인된 미리 설치한 클라이언트 파일 디렉토리 설정 변경후 도커 재빌드




libnnz21.so cannot open shared object file no such file or directory

 

두 번째 libnnz21 관련 에러 발생 이 부분은 LD_LIBRARY_PATH에 해당 파일의 경로를 설정해주고 conf파일 생성 및 ldconfig로 캐시 다시 설정으로 해결 libaio1 관련 에러가 나오면 

RUN apt-get update && apt-get install -y libaio1 코드도 추가 (debian 리눅스 기준)

(oracle linux는 RUN yum instaall -y libaio 설치)

RUN apt-get update && apt-get install -y libaio1
RUN sh -c "echo /app/instantclient_21_14 > /etc/ld.so.conf.d/oracle-instantclient.conf"
RUN ldconfig
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/instantclient_21_14

주의할 점은 step1 ,step2로 나눠 빌드 시도하였는데 환경설정 및 반영은 step2에서 해야 반영된다

 

최종 수정한 Dockerfile 

FROM centos:8 AS builder

WORKDIR /app

COPY . .
RUN pwd
RUN ls -al

# Step 2
## base image for Step 2: Node 20.11.0
FROM node:20.11.0
WORKDIR /app

## Step 1의 builder에서 build된 프로젝트를 가져온다
COPY --from=builder /app ./

RUN ls -al
RUN npm install
RUN npm run build
RUN apt-get update && apt-get install -y libaio1
RUN sh -c "echo /app/instantclient_21_14 > /etc/ld.so.conf.d/oracle-instantclient.conf"
RUN ldconfig
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/instantclient_21_14
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/instantclient_21_14
RUN echo $LD_LIBRARY_PATH

## application 실행
CMD ["npm", "run", "start:prod"]

 

 

 

*해결안된 이슈

.bashrc에 해당 export LD_LIBRARY_PATH=/app/instantclient_21_14 문구를 넣어

source .bashrc하면 설정할 수 있으나

docker run 과정에서 해당부분은 에러가 발생.

Step 7/18 : RUN source .bashrc
 ---> Running in 07f06f80a0ed
/bin/sh: 1: source: not found
The command '/bin/sh -c source .bashrc' returned a non-zero code: 127

 

 

 
반응형
post image post image post image post image post image post image post image