Bun.build
ビルドすると以下のような感じになります。
.├── node_modules├── dist/│ ├── src/│ │ └── main.js│ ├── package.json│ └── tsconfig.build.tsbuildinfo├── package.json├── tsconfig.json└── tsconfig.build.json
NodeJSでビルドしたときだとnode_modules
とdist
があればnode dist/src/main
で起動できました。
Bunの場合はbun dist/src/main.js
で起動できます。Nodeの場合と違って拡張子を指定しなければいけないようです。
Dockerfile
Bunの公式サイトにDockerfileのドキュメントがあるのでそれを参考にしてみます。
FROM oven/bun:1 AS base
# Development InstallFROM base AS installWORKDIR /app/devCOPY package.json bun.lockb ./RUN bun install --frozen-lockfile
# Production InstallWORKDIR /app/prodCOPY package.json bun.lockb ./RUN bun install --frozen-lockfile --production --ignore-scripts
# Pre ReleaseFROM base AS prereleaseWORKDIR /appCOPY --from=install /app/dev/node_modules node_modulesCOPY . .
# Test and BuildENV NODE_ENV=productionRUN bun testRUN bun run build
途中まで書くとこういう感じになります。
実行時にはdevDependencies
は不要なのですがビルドのときには必要な場合があるのでビルドのときにはDevelopment
の方のnode_modules
を利用します。
なのでPre Release
のところでは/app/dev/node_modules
の方を使っているわけですね。
そしてもともとあるソースコードを利用してテストとビルドを実行します。
ここのビルドが通れば上で書いたようなディレクトリ構成でトランスパイルされたものが出力されるのでPre Release
のコンテナは以下のようになるはずです。
app/├── node_modules├── src/│ └── main.ts├── dist/│ ├── src/│ │ └── main.js│ ├── package.json│ └── tsconfig.build.tsbuildinfo├── package.json├── tsconfig.json└── tsconfig.build.json
ただ、実際にはCOPY . .
でディレクトリの全てのファイルをコピーしてきているので余計なファイルも多分に含まれています。余計なファイルを同梱するとイメージのサイズが大きくなるのでそれらは含まないように配慮してリリース用のイメージにコピーします。
リリース用イメージ
ここで再度公式ドキュメントを参考にコピーするファイルを選定します。
FROM base AS releaseWORKDIR /appCOPY --from=install /app/dev/node_modules ./node_modulesCOPY --from=prerelease /app/dist/src ./srcCOPY --from=prerelease /app/package.json ./package.jsonCOPY --from=prerelease /app/tsconfig.json ./tsconfig.json
よくわからないのですがBunは実行時にもどうもpackage.json
とtsconfig.json
が必要なので突っ込みました。
あと、ビルドした段階ではNestJSはデフォルトで./dist
にトランスパイルしたコードが出力されるのですがこれをそのまま突っ込むとモジュールの参照エラーが発生します。
どうもbun run **/main.js
を実行したときのディレクトリからの相対パスが問題っぽくbun run src/main.js
で実行できるようなディレクトリ構造になっていないとダメなようです。
なのでCOPY --from=prerelease /app/dist/src ./src
としてdist/src
の中身をsrc
にコピーするという若干ややこしいことをしています。