
container2wasmを試した記録
概要
ktock/container2wasm: Container to WASM converter (github.com)
のcontainer2wasmを試した記録です。
Linuxで実行する
Githubのリリースページからcontainer2wasmの実行ファイルをダウンロードしました。 Docker imageをpullしてc2w(container2wasm)で、wsam形式にコンバートしました。
$ docker pull ubuntu:24.04
$ ./c2w ubuntu:24.04 out.wasm ←すごく時間がかかった
次に、Wasmtimeで実行しました。
wstimeは、curlで実行するように書かれています。ただしroot権限は不要でした。HOMEディレクトリにインストールされる模様です。
$ curl https://wasmtime.dev/install.sh -sSf | bash
$ wasmtime out.wasm
これでコンテナに入れました。
--dirオプションでディレクトリをゲストに見せることもでました。
$ wasmtime --dir hostdir::/gestdir out.wasm
ブラウザで実行する
container2wasm/examples/wasi-browser/htdocs at main · ktock/container2wasm (github.com)
↑の下のファイルとout.wasmをhttpsサーバに置きました。
container2wasm/examples/wasi-browser/xterm-pty.conf at main · ktock/container2wasm (github.com)
また↑を参考にNGINXの設定で↓のヘッダーを返す設定を入れました。
add_header 'Cross-Origin-Opener-Policy' 'same-origin';
add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
これで動きました。
ブラウザ実行時のコンテナの入出力をカスタマイズする
unclear how to pass custom arguments and files to the container started on browser · Issue #216 · ktock/container2wasm (github.com)
↑を見るとargsとfdsを変更するとコンテナに渡す引数とファイルディスクリプタをカスタマイズすることができるようです。
worker.jsのonmessage関数のargs定義を下記とすると引数をカスタマイズすることはできました。
var args = ['arg0', '/usr/bin/date'];
内部的に↓を使っているようです。
bjorn3/browser_wasi_shim: A WASI shim for in the browser (github.com)
worker.jsの"function wasiHack(wasi, ttyClient, connfd)"にwasiとTtyClientをつなぐ標準入出力の処理が書かれていました。
ttyClient.onWriteの呼び出し前の場所を横取りできそうでした。
buf.forEach(ccc => {
console.log("stdout:"+ String.fromCharCode(ccc) );
});
ttyClient.onWrite(Array.from(buf));
実際にttyClient.onWriteの前にブラウザコンソール出力を足すとブラウザの開発者画面で見れました。