試試將.NET7編譯為WASM并在Docker上運行( 二 )

runc而是wasmedge 。

試試將.NET7編譯為WASM并在Docker上運行

文章插圖
wasmedge也是一個實現了WASI標準的WASM運行時,和上文提到的wasmtime一樣 。
要實現在Docker上運行WASM程序需要安裝Docker的預覽版 , 鏈接https://docs.docker.com/desktop/wasm/ 。
試試將.NET7編譯為WASM并在Docker上運行

文章插圖
然后我們整一個Dockerfile,我們直接依賴scratch鏡像即可 , 因為它不需要其它的基礎鏡像(暫時我沒有使用.NET7的多段構建鏡像,聽大佬說目前貌似有問題) 。
FROM scratchCOPY ./bin/Release/net7.0/PublishDotNetToWASM.wasm /PublishDotNetToWASM.wasmENTRYPOINT [ "PublishDotNetToWASM.wasm" ]再使用下面的命令構建Docker鏡像,由于是wasm鏡像,所以需要帶額外的參數 。
docker buildx build --platform wasi/wasm32 -t publishdotnettowasm .可以看到打包出來的鏡像是非常小的,只有3.68MB 。
試試將.NET7編譯為WASM并在Docker上運行

文章插圖
運行的話也很簡單,用下方的命令即可,需要指定runtime為io.containerd.wasmedge.v1 , 另外也需要指定paltform 。
docker run --rm --name=publishdotnettowasm --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 publishdotnettowasm我把dotnet原生運行、wasmtime運行、docker WASI運行都跑了一下,可以發現目前來說性能是慘不忍睹 。
試試將.NET7編譯為WASM并在Docker上運行

文章插圖
總結以上就是如何將.NET7程序發布到WASM,然后在Docker最新的WASI中運行的樣例,目前來看基本的運行都已經OK,不過正如前面提到的,現在性能還是太受影響了 。
這不僅僅是在.NET平臺上,其它語言Rust、C、C++編譯為WASM上都有明顯的性能下降 。
試試將.NET7編譯為WASM并在Docker上運行

文章插圖
思來想去可能在一些插件化和不需要性能很好的場景WASI會比較用 。不過這些都需要時間慢慢見證,畢竟存在即合理,像JS這樣的語言不一樣好好的?
【試試將.NET7編譯為WASM并在Docker上運行】我們可以拭目以待,看看WASM/WASI會不會給我們帶來其它驚喜,期待后續Steve Sanderson大佬和WASM社區的相關優化 。
源碼鏈接https://github.com/InCerryGit/PublishDotNetToWASM
參考文獻https://www.docker.com/blog/docker-wasm-technical-preview/https://www.zhihu.com/question/304577684/answer/1961085507https://arghya.xyz/articles/webassembly-wasm-wasi/https://laurentkempe.com/2022/10/31/experimenting-with-dotnet-7-wasm-and-wasi-on-docker/

推薦閱讀