오늘은 도커와 전쟁을 한 날이다. (는 지금까지 싸우다가 해결해서 씀)
해결하는데 4시간 가까이 걸렸다;
개발환경과 배포환경이 다르다.
지금까지 개발은 로컬에서 해왔기 때문에 Intel Mac OS
에서 진행이 됐다.
그런데 배포환경은 당연히 docker
로 말아서 올려야하는데, 그러다보니 오라클 연결이 안됐다.
DockerFile에 FROM이 node:18이 아니라 node:18-alpine 이였는데, 이것부터 확인했어야 했다...
내가 찾아본 자료는 apt-get이였는데, 기존 도커파일은 apk가 적혀있었다.
이게뭐지? 헤헿 충돌나네
하고 찾아보니 애초에 운영체제가 달랐다.
apk는 알파인 리눅스라는 운영체제에서 사용하는 패키지 관리자였다.
https://www.lesstif.com/docker/alpine-linux-35356819.html
apt-get은 데비안 계열의 리눅스 운영체제에서 사용하는 패키지 관리자였다.
https://blog.outsider.ne.kr/346
그래서 apt-get으로 된 자료는 다 버리고... apk로 사용하는 것이 필요했다.
팀프로젝트를 할 땐, start:dev만 사용했기 때문에 build를 하지 않았다(...)
기존에 사용하던 DockerFile을 보면 build -> start:prod를 하길래 이것부터 파악을 했어야했다.
뭐가 되는 것인가? 라는 생각을 가지고 로컬에서 사용을 해봤는데
dist 폴더가 생기면서 작성한 코드들이 컴파일되서 실행할 수 있는 상태가 되는 것이였다.
여기서 폴더를 넣으면 될까? 라는 생각으로 오라클 폴더를 넣어봤는데...
안들어가, 그냥 타입스크립트만 적용이 되는 것 같았다.
지금까지는 내가 docker-compose를 주로 써서 DockerFile을 잘 쓰지 못했다.
그래서 파일 복사를 하려는데 안돼.
모르겠어;
그럼 뭐해야겠어?
또 찾아야지
https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit07/10
확인을 해봤더니 이렇게 하면 되더라.
oracle 폴더는 root/src/oracle에 있다.
COPY src/oracle ./oracle/
이러면 딱 생기더라(별 헛짓 다했음)
오라클 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분...
계속 다운로드 받는 것은 별로인 것 같아서 파일 자체를 받아서
내부에서 풀어쓰는 것으로 만들어보려고 했더니 안되네?
하하 젠장