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