Docker-compose에서만 발생하는 "Error: Cannot find module @rollup/rollup-linux-arm64-gnu" 오류 해결

JUNG MINU·2024년 12월 2일
0
post-thumbnail

아래 방법을 시도하기 전, 해당 오류에 대한 활발한 토론이 있었던 Github issue를 먼저 확인하고 시도해주시기 바랍니다.

링크: https://github.com/vitejs/vite/discussions/15532

Turborepo로 구성된 모노레포 환경에서 아래 명령어를 통해 Dockerfile을 빌드할 경우 정상적으로 동작하지만,

sudo docker build -f apps/{app-name}/Dockerfile .

잘 구성된 docker-compose를 이용한 빌드에서만 아래와 같은 오류가 발생했습니다.

sudo docker compose up --build

...

/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js:63
                throw new Error(
                      ^

Error: Cannot find module @rollup/rollup-linux-arm64-gnu. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
    at requireWithFriendlyError (/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js:63:9)
    at Object.<anonymous> (/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js:72:76)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at cjsLoader (node:internal/modules/esm/translators:356:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:305:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24) {
  [cause]: Error: Cannot find module '@rollup/rollup-linux-arm64-gnu'
  Require stack:
  - /app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js
      at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
      at Module._load (node:internal/modules/cjs/loader:985:27)
      at Module.require (node:internal/modules/cjs/loader:1235:19)
      at require (node:internal/modules/helpers:176:18)
      at requireWithFriendlyError (/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js:45:10)
      at Object.<anonymous> (/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js:72:76)
      at Module._compile (node:internal/modules/cjs/loader:1376:14)
      at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
      at Module.load (node:internal/modules/cjs/loader:1207:32)
      at Module._load (node:internal/modules/cjs/loader:1023:12) {
    code: 'MODULE_NOT_FOUND',
    requireStack: [
      '/app/node_modules/.pnpm/rollup@4.24.4/node_modules/rollup/dist/native.js'
    ]
  }
}

해결 과정

해결을 시도하던 중 한가지 특이한 점을 발견했는데요, 바로 모든 node_modules 폴더를 삭제한 뒤 docker-compose build를 하면 빌드가 정상적으로 되는 것이었습니다.

원인 이해

원인은 모노레포의 루트 디렉토리의 node_modules 폴더를 docker-compose가 그대로 복사해가면서 발생하는 문제였습니다.

해결방법은 되지 못했지만 상세한 오류 원인에 대한 이해는 해당 글을 통해 할 수 있었는데요, 특정 rollup 플러그인 또는 패키지는 사용자 환경에 없는 플랫폼의 바이너리를 필요로 하기 때문에, 해당 플러그인을 필요로 한다는 점이었습니다.

즉 제가 Dockerfile에서 빌드용 이미지로 사용하는 node:20.11.1-alpine과 제 로컬 환경이 다르기 때문에 제 로컬 node_modules폴더를 복사해 갈 경우 문제가 발생한다는 것이었죠.

아마도, 패키지 관리자가 의존성을 설치하는 과정에서 환경에 따라 각각 다른 작업들을 해주는 것 같았고, 제 로컬 node_modules를 복사해 갈 경우 도커는 성능 최적화를 위해 특정 과정을 생략하면서 발생하는 문제 같았습니다.

해결

해결방법이 어처구니 없이 간단했는데요,
모노레포의 루트 폴더에 .dockerignore 파일을 추가해 주는 것입니다.

# .dockerignore

node_modules

이 경우 정상적으로 빌드된 이미지가 생성됩니다.


참고문서
https://github.com/vitejs/vite/discussions/15532
https://sandipdulal.medium.com/fixing-vite-build-error-on-linux-and-windows-using-docker-error-cannot-find-module-e73bb2fb479d

profile
감각있는 프론트엔드 개발자 정민우입니다.

0개의 댓글