Development/Node.js

시놀로지 Docker에서 Node.js 구동시 Invaild ELF header 오류

ANTEGRAL 2020. 3. 21. 13:39
반응형

발단

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에서도 이런 케이스가 있는듯했다.

반응형