Post

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

해결

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.