2024年3月23日土曜日

Windows コンテナで Node.js アプリケーションをシングルバイナリにする

今回は、 Node.js アプリケーションのシングルバイナリ化をやってみる。

対象のアプリケーションは devcontainers/cli

nexe/nexeNode.js v21 の Single executable applications の 2 パターンでやってみる。

前提

  • OS: Windows 11 Pro 23H2 ビルド 22631.3155
  • Docker Desktop: Version 4.28.0 (139021)
  • 使用イメージ: mcr.microsoft.com/windows/servercore:ltsc2022

コンテナ起動

Node.js のビルドにはたくさんメモリが必要なので、 -m で明示的に指定。

docker run -it --rm --cpus 20 -m 16G -v "$(pwd):C:\dist" mcr.microsoft.com/windows/servercore:ltsc2022 powershell.exe

ビルド環境構築

開発ツール一式をインストール

Set-ExecutionPolicy Unrestricted -Force
iex ((New-Object System.Net.WebClient).DownloadString('https://boxstarter.org/bootstrapper.ps1'))
get-boxstarter -Force
Install-BoxstarterPackage https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter -DisableReboots
refreshenv

Visual Studio に必要なコンポーネントを追加

& 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe' modify `
    --installPath 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools' `
    --add Microsoft.VisualStudio.Component.Windows11SDK.22621 `
    --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
    --add Microsoft.VisualStudio.Component.VC.Runtimes.x86.x64.Spectre `
    --quiet

Node.js のインストール

choco install nodejs

パス環境変数の更新

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")

devcontainers/cli をシングルバイナリにしてみる

nexe/nexe で作る

git clone --depth 1 -b v0.58.0 https://github.com/devcontainers/cli devcontainers-cli
cd devcontainers-cli
npm i -g yarn
yarn
yarn compile-prod
npx nexe -i ./devcontainer.js -t windows-x64-21.7.1 -b -o /dist/devcontainer-windows-x64-21.7.1-nexe.exe

~\.nexe\21.7.1\out\Release\node.exe に nexe 向けの node.exe が配置される。 これを ~\.nexe\windows-x64-21.7.1 に移動し、 -b を外すことで、次回以降、このバイナリを利用してシングルバイナリを作るようになる。

mv ~\.nexe\21.7.1\out\Release\node.exe ~\.nexe\windows-x64-21.7.1

Node.js の Single executable applications で作る

# シングルバイナリに使うための node 実行ファイルをコピー
Copy-Item 'C:\Program Files\nodejs\node.exe' .\devcontainer-windows-x64-21.7.1-sea.exe

# sea 用の設定ファイル作成
Write-Output '{"main": "./dist/spec-node/devContainersSpecCLI.js", "output": "sea-prep.blob"}' | Out-File -Encoding ascii .\sea-config.json

# blob の作成
node --experimental-sea-config sea-config.json

# BLOB を注入し、シングルバイナリを作る
npx postject devcontainer-windows-x64-21.7.1-sea.exe NODE_SEA_BLOB sea-prep.blob `
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2

# コンテナの外にコピー
Copy-Item .\devcontainer-windows-x64-21.7.1-sea.exe \dist

参考資料

変更履歴

日付 内容
2024/3/23 新規作成
2024/4/2 nexe 用 node バイナリ格納場所の間違いを修正(~/nexe -> ~/.nexe)

0 件のコメント:

コメントを投稿