Docker invalid ELF header bcrypt 오류 해결 방법

윈도우 환경에서 잘 사용 중이던 Node.js 앱에서 Docker를 실행하던 중 bcrypt 오류가 발생하였습니다.

이는, 윈도우 환경에서의 npm 설치와 리눅스 환경에서의 npm 설치 환경 차이로 인한 오류라고 합니다.

그러고보니 보통은 wsl2 에서 작업을 했었는데, 이번의 경우에는 순수 윈도우 10 환경에서 작업하다 발생을 했으며 , wsl2 에서는 발생하지 않았습니다.

invalid ELF header 오류 해결 방법

오류는 다음과 같이 발생을 합니다.

  Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
      at Object.Module._extensions..node (node:internal/modules/cjs/loader:1327:18)
      at Module.load (node:internal/modules/cjs/loader:1091:32)
      at Function.Module._load (node:internal/modules/cjs/loader:938:12)
      at Module.require (node:internal/modules/cjs/loader:1115:19)
      at require (node:internal/modules/helpers:130:18)
      at Object.<anonymous> (/app/node_modules/bcrypt/bcrypt.js:6:16)
      at Module._compile (node:internal/modules/cjs/loader:1241:14)

invalid ELF header 오류 원인은

docker-compose 기준으로(혹은 -v /app/node_modules) volumes에 정의해 두었는데 왜 이런 문제가 발생했을까를 찾다가 정리해 보았습니다.

운영체제가 윈도우(개발환경)/리눅스(도커환경) 등의 차이가 발생할 때에는 아래의 정의만으로는 해결이 되지 않습니다.

  backend:
    ...
    ports:
      - "8080:8080"
    volumes:
      - ./backend:/app
      - /app/node_modules

또 다 그런것도 아니고, 특정 npm 모듈의 특성에 따라 문제가 되는 경우가 생깁니다.

가장 간단하고 무식한 방법

가장 간단한 방법은 Docker의 대상이 되는 윈도우 상 Target 폴더의 node_modules를 지워버리는 겁니다.

FROM node:20

WORKDIR "/app"

COPY ./package.json ./

RUN npm install

COPY . .

위의 COPY 과정에서 윈도우의 내용이 복사가 되는 것인데요, 그렇기 때문에 일단 지워두고 작업한 뒤 Docker 작업을 마친 후 다시 install 한 후 다시 작업을 하면 됩니다.

하지만, 이는 왜 이런 현상이 생기는지 이해의 차원에서 기술한 해결책이므로 비추드리며, 당연히 삭제 및 재설치 등으로 매우 불편하기도 할 뿐더러, bind mount 등으로 실시간 수정 개발 작업을 하기도 쉽지 않아집니다.

.dockerignore 파일 활용

저는 이 방법으로 해결을 했는데요, 그동안 ignore를 쓰지 않았던 이유는 그간은 저런 문제가 없었기도 했고 보통은 wsl2나 aws 리눅스 환경에서만 작업을 했기에 굳이 해당 오류 건을 본 적이 없어 인지하지 못했습니다.

.dockerigonre 파일을 만든 후 아래와 같이 기술합니다.

node_modules

단, 만약 docker-compose 등을 사용한다면 compose 파일은 Dockerfile 과 위치가 다를 수도 있는데요, dockerignore 파일은 Dockerfile과 같은 디렉토리 위치에 두어야 합니다.

도커 파일과 같은 위치에 ignore 파일 위치

이상으로 윈도우 Docker 환경에서 접해 볼 수 있는 invalid ELF header bcrypt 오류 해결 방법에 대해서 정리해 보았습니다.

그 밖에 도움 되는 글

AWS 라이트세일 Docker 개발 환경 Todo(2023)

나의 MobaXterm 세팅 – 테마, 폰트, 주요 기능 등

윈도우 WSL2 Docker 개발 환경,리액트+Node.js 핫리로디드 요약(2023)