Post

알파인 노드 이미지에서 bcrypt 사용하기

240920 TIL: mob 기업과제를 진행하며 마주한 bcrypt 에러

알파인 노드 이미지에서 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 이미지로 사용하고 있는게 문제의 원인이었다.

해결

bcryptbcryptjs로 변경해 해결하였다. 이를 납득하기 위해선 아래 두 토픽을 알아야 한다.

bcrypt와 bcryptjs

  • bcrypt는 C++로 써진 native module이라 순수 JS로만 써진 bcryptjs보다 더 빠르고 가볍다.
  • bcryptx86_64glibc 기반의 리눅스 배포판 외의 아키텍처에서 빌드할 경우 컴파일을 위해 추가적인 종속성이 필요하다.
  • 요약의 출처

Alpine과 그 외 리눅스 배포판 간단히 알아보기

  • 먼저 Linux는 오픈소스 운영 체제로, 이번에 사용한 Alpine뿐만 아니라 Ubuntu, Red Hat, Debian 등 여러 배포판이 존재한다.
  • Alpine Linux: 작고(8mb), 심플하다. 컨테이너 환경에서 많이 쓰인다. 또한 C 라이브러리로 glibc가 아닌 Musl을 사용한다.
  • Debian Linux: 커뮤니티 기반으로 개발되고 있고, 안정성과 성능에 중심을 둔다.
  • Ubuntu Linux: Debian을 기반으로 하는 배포판으로 기업이 관리해 Debian보다 자유도는 떨어지지만 사용자 경험을 향상시키는데 초점을 둔다. 가장 인기 있는 리눅스 배포판 중 하나이다.
  • Red Hat Linux: Ubuntu와 같이 기업이 관리하며 전세계적으로 엔터프라이즈 서버 환경 점유율이 가장 높다. 안정성을 우선한다.
  • 여러 배포판이 있고, 데스크톱 환경인지, 서버 환경인지 등 환경에 따라 선호되는게 다르다.

납득하기

  • bcryptx86_64glibc 기반의 리눅스 배포판 외의 아키텍처에서 컴파일 할 때 추가 종속성이 필요하다.
  • 나는 glibc가 아닌 Musl을 사용하는 알파인 리눅스 기반의 노드 이미지를 띄워 작업하고 있었다.

    => 내 도커 컨테이너에서 bcrypt를 컴파일 할 수 없어 생긴 문제였다.

  • 그래서 순수 JS로 쓰인 bcryptjs로 변경해 해결할 수 있었다.
  • 도커 이미지를 Debian Linux로 바꿔 해결할 수도 있다. [참고-node 공식 이미지]

마치며

이 글의 댓글 중 하나. 아웃겨

Docker를 공부하다 Linux를 공부하다 운영 체제를 공부하다… 물론 겉핥기만 했지만? 진짜 개발 공부는 양파같음을 다시금 느낀다. 또 클라우드 환경을 제대로 이해하기 위해선 정말 많은 배경지식이 필요함을 느꼈다. 이번 문제도 처음에 알파인? 데비안? 이게 다 리눅스라고? 라고 했던 기억이 있다. 열심히 해야겠다…🥹

참고

This post is licensed under CC BY 4.0 by the author.