🐳
Dockerで動くNestJSのbuildをSWCを使って速くする
概要
- DockerでNestJSを動かしています。ホットリロードが重いので、SWCを導入してbuildを速くしたいと思います。
設定内容
- 基本的にNestJS公式(下記参考に記載)と同じやり方です。
- SWCのインストールは公式を参照してください。
- 各種ファイル設定は以下です。
package.json
"scripts": {
"build": "npx swc src -d dist",
"start:dev": "nest start -b swc -w",
}
nest-cli.json
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true,
"builder": {
"type": "swc",
"options": {
"swcrcPath": ".swcrc"
}
},
"typeCheck": true
}
}
.swcrc
{
"$schema": "https://json.schemastore.org/swcrc",
"sourceMaps": true,
"jsc": {
"parser": {
"syntax": "typescript",
"decorators": true,
"dynamicImport": true
},
"transform": {
"legacyDecorator": true,
"decoratorMetadata": true
},
"baseUrl": "./"
},
"minify": false,
"module": {
"type": "commonjs"
},
"sourceMaps": true
}
詰まった所
- 以下のようにエラーになりました。dockerコンテナ内にコンパイル後のファイル達が存在しないようです。
api-1 | Error: Cannot find module '/app/dist/main' api-1 | at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15) api-1 | at Function.Module._load (node:internal/modules/cjs/loader:873:27) api-1 | at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) api-1 | at node:internal/main/run_main_module:22:47
解消方法
- dockerのbuild時にRUNコマンド(Dockerfile)で
npm run build
を指定してもうまくいきませんでした。 - dockerの立ち上げ時にentrypoint(docker-compose.yml)で指定するとうまくいきました。
- dockerコンテナが立ち上がった後でコンパイルするイメージかと思います。
docker-compose.yml# 一部抜粋 service: api: entrypoint: ['sh', '-c', 'npm run build && npm run start:dev']
参考
Discussion