출근 64일차

·2022년 11월 24일
1

회사이야기

목록 보기
64/118

오늘은 도커와 전쟁을 한 날이다. (는 지금까지 싸우다가 해결해서 씀)

해결하는데 4시간 가까이 걸렸다;

운영체제가 달라지....면 오라클 연결이 안돼

개발환경과 배포환경이 다르다.

지금까지 개발은 로컬에서 해왔기 때문에 Intel Mac OS에서 진행이 됐다.

그런데 배포환경은 당연히 docker로 말아서 올려야하는데, 그러다보니 오라클 연결이 안됐다.

DockerFile에 FROM이 node:18이 아니라 node:18-alpine 이였는데, 이것부터 확인했어야 했다...

apk랑 apt-get은 달라!

내가 찾아본 자료는 apt-get이였는데, 기존 도커파일은 apk가 적혀있었다.

이게뭐지? 헤헿 충돌나네

하고 찾아보니 애초에 운영체제가 달랐다.

apk는 알파인 리눅스라는 운영체제에서 사용하는 패키지 관리자였다.
https://www.lesstif.com/docker/alpine-linux-35356819.html

apt-get은 데비안 계열의 리눅스 운영체제에서 사용하는 패키지 관리자였다.
https://blog.outsider.ne.kr/346

그래서 apt-get으로 된 자료는 다 버리고... apk로 사용하는 것이 필요했다.


nest build는 뭐야?

팀프로젝트를 할 땐, start:dev만 사용했기 때문에 build를 하지 않았다(...)

기존에 사용하던 DockerFile을 보면 build -> start:prod를 하길래 이것부터 파악을 했어야했다.

뭐가 되는 것인가? 라는 생각을 가지고 로컬에서 사용을 해봤는데

dist 폴더가 생기면서 작성한 코드들이 컴파일되서 실행할 수 있는 상태가 되는 것이였다.

여기서 폴더를 넣으면 될까? 라는 생각으로 오라클 폴더를 넣어봤는데...

안들어가, 그냥 타입스크립트만 적용이 되는 것 같았다.


파일 copy를 어떻게 하는거지? from DockerFile

지금까지는 내가 docker-compose를 주로 써서 DockerFile을 잘 쓰지 못했다.

그래서 파일 복사를 하려는데 안돼.

모르겠어;

그럼 뭐해야겠어?

또 찾아야지

https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit07/10

확인을 해봤더니 이렇게 하면 되더라.

oracle 폴더는 root/src/oracle에 있다.

COPY src/oracle ./oracle/

이러면 딱 생기더라(별 헛짓 다했음)

docker run이 안되는데, 폴더 위치를 어떻게 봐야해?

오라클 DB 연결이 안되서 강제 다운이 계속 진행됐다.

파일 위치 확인을 해야 어떤 상태인지 알 수 있었는데,
컨테이너가 만들어졌다면 docker exec -it 컨테이너 네임 bash 으로 들어갔겠지만
안켜지는데 컨테이너 네임이 어딨어(...)

그래서 또 찾아봤다!

docker run imageName ls (원하는 폴더 위치)

이렇게 했더니 실행을 하지 않더라도 어떤 파일이 존재하는지 확인할 수 있었다.

어, 뭐야 요구하는 파일 이름이.....달라?

사실 여기가 핵심이였는데, 바로 운영체제에 따라서 요구하는 파일이 달랐다.

아래의 스샷은 Intel Mac 로컬환경에서 일부로 틀렸을 경우 발생하는 로그다.

Cannot locate a 64-bit Oracle Clinet library dlopen(Desktop/oracle/libclntsh.dylib,1)


아래의 스샷은 linux x64 alpine 환경에서 연결이 안될 경우 발생하는 로그다.

Cannot locate a 64-bit Oracle Client library: "Error loading shared library /Desktop/oracle/libclntsh.so

와, 실행할 때 요구하는 파일이 그냥 다르네?

여기서 알아차렸다.

아 운영체제가 다르면 진짜 여러가지 상황이 발생 할 수 있구나(....)

아, 원점으로 돌아가서 그럼 저 파일은 어디서 구해야?

열심히 서치를 하다가 찾았다. 나의 답안지!

https://github.com/Shrinidhikulkarni7/OracleClient_Alpine/blob/master/Dockerfile

RUN apk --no-cache add libaio libnsl libc6-compat curl && \
    cd /tmp && \
    curl -o instantclient-basiclite.zip https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -SL && \
    unzip instantclient-basiclite.zip && \
    mv instantclient*/ /usr/lib/instantclient && \
    rm instantclient-basiclite.zip && \
    ln -s /usr/lib/instantclient/libclntsh.so.21.1 /usr/lib/libclntsh.so && \
    ln -s /usr/lib/instantclient/libocci.so.21.1 /usr/lib/libocci.so && \
    ln -s /usr/lib/instantclient/libociicus.so /usr/lib/libociicus.so && \
    ln -s /usr/lib/instantclient/libnnz21.so /usr/lib/libnnz21.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

빤히 봤더니 여기에 내가 찾고 있던 libclntsh.so이 존재했다.

그래서 세팅을 해가지고 바로 올려봤더니............

됐어! 해결했다고!!!!!1

근데 이렇게 막 올라가있는거 상업용으로 써도 되나(라이센스 MIT긴 하던데)


그 외의 이야기도 적으려다가 내용이 너무 많아져서 미뤄야겠다.

아 그리고 지금 11월 25일 00시 38분...

계속 다운로드 받는 것은 별로인 것 같아서 파일 자체를 받아서
내부에서 풀어쓰는 것으로 만들어보려고 했더니 안되네?

하하 젠장

profile
물류 서비스 Backend Software Developer

0개의 댓글