文章插图
运行WASM程序此时我们可以安装一下
Wasmtime
来执行我们的程序,通过https://wasmtime.dev/
下载安装:文章插图
然后就可以直接使用
wasmtime
命令运行我们的程序,我分别使用wasmtime
和dotnet
运行了我们的程序:文章插图
可见目前来说WASM的性能还是惨不忍睹的,等一等后续的优化吧 。
将.NET发布到Docker WASI再来看看我们的Docker,对于Docker支持WASI我感到并不意外,因为Docker的容器化对于直接执行的WASM来说还是比较重,支持它是一个拓宽影响力的好事 。具体的执行模型如下所示,对于WASM应用有着不同的执行方式 。不再使用
runc
而是wasmedge
。文章插图
wasmedge
也是一个实现了WASI标准的WASM运行时,和上文提到的wasmtime一样 。要实现在Docker上运行WASM程序需要安装Docker的预览版,链接
https://docs.docker.com/desktop/wasm/
。文章插图
然后我们整一个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 。文章插图
运行的话也很简单,用下方的命令即可,需要指定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最新的WASI中运行的样例,目前来看基本的运行都已经OK,不过正如前面提到的,现在性能还是太受影响了 。
这不仅仅是在.NET平台上,其它语言Rust、C、C++编译为WASM上都有明显的性能下降 。
文章插图
思来想去可能在一些插件化和不需要性能很好的场景WASI会比较用 。不过这些都需要时间慢慢见证,毕竟存在即合理,像JS这样的语言不一样好好的?
我们可以拭目以待,看看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/
【试试将.NET7编译为WASM并在Docker上运行】
经验总结扩展阅读
- 怎么判断自己是否有烟瘾
- boss怎么取消面试预约 boss取消面试在哪
- 喜欢试探人防备心很重的几星座
- 用胸有成竹造句 胸有成竹 写一句话
- 免费店铺取名字大全 店铺名称评分测试打分免费
- 属兔的人和什么生肖比较旺 乐于尝试状态极佳
- 抖音小店飞鸽客服上岗考试答案
- 2023年抖音飞鸽客服考试答案
- 一 我要涨知识 —— TypeScript 常见面试题
- 月饼皮太散包不了怎么办