반응형
발단
bcrypt를 사용하고 윈도우 -> 리눅스(시놀로지 Docker)로 옮기고 실행해보니 이런 오류가 난다.
~.node: Invaild ELF header
해결 방법
이럴 경우에는 docker node.js 이미지에 붙어있는 패키지 매니저를 사용해야 한다.
컨테이너 내부에 있는 node 파일 경로는,
공식 이미지 설명 기준, /home/node/app/~
가 파일 경로이다.
만약 안된다면 /home/node
를 직접 확인해야한다.
Synology 기준
본 솔루션은 공식 이미지 설정 방법에 따라서 설정했고, 경로에 package.json이 있는 경우를 가정하여 설명한다.
Docker 창을 열고 컨테이너로 들어간다.
node.js 컨테이너를 킨 후, 컨테이너 내부 메뉴로 들어간 후 터미널 버튼 누르고 생성 버튼을 누른다.
키자마자 아마 계속 오류를 계속 내뱉고 꺼지거나 재시작 할 수 있다. 일단 최소한 실행이 된 상태로 유지는 되게 코드를 편집하거나, 실행 명령을 변경하자. 나는 전자를 택했다.
옆에 bash
가 생기면 누르고
cd /home/node/app
를 입력하여 해당 파일로 이동한다.
그리고 node_modules 폴더를 통째로 지워버린다.
다음엔 npm install로 다시 모듈들을 설치한다.
npm install
그리고 코드나 실행명령을 다시 원상 복구하고 실행하면 된다.
원인
bcrypt는 C++ 파일들로 (bcrypt 뿐만 아니라, 일부 다른 모듈도) 구동이 된다고 한다. 따라서 빌드를 하게 되는데,
npm 같은 패키지 매니저는 빌드를 할 때 해당 OS를 따라서 빌드한다고 한다.
문제는 윈도우와 리눅스의 환경이 완전히 다르다 보니 이런 오류가 생기는 듯하다.
Heroku에서도 이런 케이스가 있는듯했다.
반응형