알파인 노드 이미지에서 bcrypt 사용하기
mob 기업과제를 진행하며 마주한 에러
알파인 노드 이미지에서 bcrypt 사용하기
문제
이번 과제에선 직접 Dockerfile을 작성해보면서 도커를 띄워 작업했다. 일단 도커라이징 먼저 하고 작업을 시작했는데 그 과정에서 이러한 에러를 마주했다.
1
2
3
4
5
6
7
8
9
10
[5:33:19 AM] Starting compilation in watch mode...
main-server |
main-server | [5:33:21 AM] Found 0 errors. Watching for file changes.
main-server |
main-server | node:internal/modules/cjs/loader:1586
main-server | return process.dlopen(module, path.toNamespacedPath(filename));
main-server | ^
main-server |
main-server | Error: Error loading shared library /usr/src/app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: Exec format error
main-server | at Module._extensions..node (node:internal/modules/cjs/loader:1586:18)
로그에서 볼 수 있듯 암호화 라이브러리인 bcrypt
쪽에서 발생한 에러였는데, 마침 node를 Alpine Linux 이미지로 사용하고 있는게 문제의 원인이었다.
해결
bcrypt
를 bcryptjs
로 변경해 해결하였다. 이를 납득하기 위해선 아래 두 토픽을 알아야 한다.
bcrypt와 bcryptjs
bcrypt
는 C++로 써진 native module이라 순수 JS로만 써진bcryptjs
보다 더 빠르고 가볍다.bcrypt
는x86_64
나glibc
기반의 리눅스 배포판 외의 아키텍처에서 빌드할 경우 컴파일을 위해 추가적인 종속성이 필요하다.- 요약의 출처
Alpine과 그 외 리눅스 배포판 간단히 알아보기
- 먼저 Linux는 오픈소스 운영 체제로, 이번에 사용한 Alpine뿐만 아니라 Ubuntu, Red Hat, Debian 등 여러 배포판이 존재한다.
- Alpine Linux: 작고(8mb), 심플하며, 안전하다. 따라서 컨테이너 환경에서 많이 쓰인다. 또한 C 라이브러리로
glibc
가 아닌Musl
을 사용한다. - Debian Linux: 커뮤니티 기반으로 개발되고 있고, 안정성과 성능에 중심을 둔다.
- Ubuntu Linux: Debian을 기반으로 하는 배포판으로 기업이 관리해 Debian보다 자유도는 떨어지지만 사용자 경험을 향상시키는데 초점을 둔다. 가장 인기 있는 리눅스 배포판 중 하나이다.
- Red Hat Linux: Ubuntu와 같이 기업이 관리하며 전세계적으로 엔터프라이즈 서버 환경 점유율이 가장 높다. 안정성을 우선한다.
- 여러 배포판이 있고, 데스크톱 환경인지, 서버 환경인지 등 환경에 따라 선호되는게 다르다.
납득하기
bcrypt
는x86_64
와glibc
기반의 리눅스 배포판 외의 아키텍처에서 컴파일 할 때 추가 종속성이 필요하다.- 나는
glibc
가 아닌Musl
을 사용하는 알파인 리눅스 기반의 노드 이미지를 띄워 작업하고 있었다. - => 내 도커 컨테이너에서
bcrypt
를 컴파일 할 수 없어 생긴 문제였다. - 그래서 순수 JS로 쓰인
bcryptjs
로 변경해 해결할 수 있었다. - 도커 이미지를 Debian Linux로 바꿔 해결할 수도 있다. [참고-node 공식 이미지]
마치며
이 글의 댓글 중 하나. 아웃겨
Docker를 공부하다 Linux를 공부하다 운영 체제를 공부하다… 물론 겉핥기만 했지만? 진짜 개발 공부는 양파같음을 다시금 느낀다. 또 클라우드 환경을 제대로 이해하기 위해선 정말 많은 배경지식이 필요함을 느꼈다. 이번 문제도 처음에 알파인? 데비안? 이게 다 리눅스라고? 라고 했던 기억이 있다. 열심히 해야겠다…🥹
참고
This post is licensed under CC BY 4.0 by the author.