[⬇️下载] [📖 命令参考] [📚 附加文档] [▶️演示]
container2wasm是一个容器到wasm镜像的转换器,可以在WASM上运行容器。
这是一个实验性软件。
浏览器上容器的演示页面(debian、python、node、vim):https://ktock.github.io/container2wasm-demo/
$ c2w ubuntu:22.04 out.wasm
上述命令将ubuntu:22.04
容器镜像转换为WASI镜像(out.wasm
)。
注1:要选择
amd64
以外的容器镜像架构,请使用c2w的--target-arch
标志(例如:c2w --target-arch=riscv64 riscv64/ubuntu:22.04 out.wasm
)。
注2:推荐使用x86_64或riscv64容器。其他平台的容器应该可以工作,但由于需要额外模拟,速度会较慢。
生成的镜像可以在WASI运行时上运行:
$ wasmtime out.wasm uname -a Linux localhost 6.1.0 #1 PREEMPT_DYNAMIC Mon Jun 5 11:57:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux $ wasmtime out.wasm ls / bin dev home lib32 libx32 mnt proc run srv tmp var boot etc lib lib64 media opt root sbin sys usr
从主机映射的目录在容器中是可访问的。
$ mkdir -p /tmp/share/ && echo hi > /tmp/share/from-host
$ wasmtime --mapdir /mnt/share::/tmp/share out.wasm cat /mnt/share/from-host
hi
请参考
./examples/networking/wasi/
来启用网络功能
你也可以在浏览器上运行容器。 在浏览器上运行容器有两种方法。
请同时参考
./examples/wasi-browser
(浏览器上的WASI示例)和./examples/emscripten
(emscripten示例)。
请参考
./examples/networking/
了解启用网络功能的详细信息。
此示例将容器转换为WASI并在浏览器上运行。
以下命令生成WASI镜像。
$ c2w ubuntu:22.04 /tmp/out-js2/htdocs/out.wasm
以下是在浏览器上运行镜像的示例,依赖于xterm-pty和browser_wasi_shim。
此示例使用apache http服务器在localhost:8080
上提供镜像。
$ cp -R ./examples/wasi-browser/* /tmp/out-js2/ && chmod 755 /tmp/out-js2/htdocs
$ docker run --rm -p 8080:80 \
-v "/tmp/out-js2/htdocs:/usr/local/apache2/htdocs/:ro" \
-v "/tmp/out-js2/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \
--entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'
你可以通过localhost:8080
在浏览器上运行容器。
容器也可以执行网络操作。 本节演示在容器中使用curl命令。
仅在Chrome上测试过。该示例可能在其他浏览器上不工作。
$ cat <<EOF | docker build -t debian-curl -
FROM debian:sid-slim
RUN apt-get update && apt-get install -y curl
EOF
$ c2w debian-curl /tmp/out-js2/htdocs/out.wasm
此示例使用apache http服务器在localhost:8080
上提供镜像。
以下操作还将可在浏览器上运行的网络栈放入文档根目录。
$ cp -R ./examples/wasi-browser/* /tmp/out-js2/ && chmod 755 /tmp/out-js2/htdocs
$ wget -O /tmp/out-js2/htdocs/c2w-net-proxy.wasm https://github.com/ktock/container2wasm/releases/download/v0.5.0/c2w-net-proxy.wasm
$ docker run --rm -p 8080:80 \
-v "/tmp/out-js2/htdocs:/usr/local/apache2/htdocs/:ro" \
-v "/tmp/out-js2/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \
--entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'
你可以在浏览器上使用几种配置运行容器:
localhost:8080/?net=browser
:带网络功能的容器。基于gvisor-tap-vsock
实现的网络栈c2w-net-proxy
在浏览器上运行,并使用浏览器的Fetch API转发HTTP/HTTPS数据包。可访问的站点集合受浏览器配置限制(例如CORS限制)。详情请参见./examples/networking/fetch
。localhost:8080/?net=delegate=ws://localhost:8888
:带网络功能的容器。你需要在主机上(浏览器外)运行基于gvisor-tap-vsock
实现的用户空间网络栈c2w-net
。它通过WebSocket转发从浏览器接收的所有数据包。详情和配置请参见./examples/networking/websocket
。(仅在Linux上测试过)localhost:8080
:不带网络功能的容器。此示例使用emscripten将容器转换为WASM。
以下命令生成可在浏览器上运行的WASM镜像和JS文件。
$ c2w --to-js ubuntu:22.04 /tmp/out-js/htdocs/
以下是基于 xterm-pty 在浏览器中运行镜像的示例。
此示例使用 Apache HTTP 服务器在 localhost:8080
上提供镜像。
$ cp -R ./examples/emscripten/* /tmp/out-js/ && chmod 755 /tmp/out-js/htdocs $ docker run --rm -p 8080:80 \ -v "/tmp/out-js/htdocs:/usr/local/apache2/htdocs/:ro" \ -v "/tmp/out-js/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \ --entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'
你可以通过 localhost:8080
在浏览器中运行容器。
注意:加载和启动容器可能需要一些时间。
还可以使用基于 gvisor-tap-vsock
实现的用户空间网络栈 c2w-net
,通过主机(浏览器外部)上的 WebSocket 启用网络功能。
详情请参阅 ./examples/networking/websocket
。
DOCKER_BUILDKIT=1
)docker build
(使用 DOCKER_BUILDKIT=1
)你可以使用以下方法之一安装转换器命令 c2w
。
注意:输出的二进制文件还包含
c2w-net
,这是一个用于控制网络功能的命令(详情请参阅 ./examples/networking)。
可以从 https://github.com/ktock/container2wasm/releases 下载二进制文件
解压缩压缩包并将二进制文件放在 $PATH
下的某个位置。
需要 Go 1.19+。
make
sudo make install
将容器镜像转换为 WASM 镜像,并将其写入指定路径(默认为当前目录下的 out.wasm
)。
用法:c2w [选项] 镜像名称 [输出文件]
镜像名称
:容器镜像名称(如果 Docker 中不存在,将从注册表拉取)[输出文件]
:结果 WASM 文件的路径。子命令
help, h
:显示命令列表或某个命令的帮助选项
--assets value
:构建资产的自定义位置。--dockerfile value
:Dockerfile 的自定义位置(默认:嵌入到此命令中)--builder value
:要使用的构建器命令(默认:"docker")--target-arch value
:要使用的源镜像的目标架构(默认:"amd64")--build-arg value
:附加的构建参数(请查看 Dockerfile 了解可用的构建参数)--to-js
:使用 emscripten 将容器转换为 WASM--debug-image
:在输出镜像中启用调试打印--show-dockerfile
:显示默认 Dockerfile--legacy
:使用 "docker build" 而不是 buildx(不支持 assets 标志)(默认:false)--external-bundle
:不将容器镜像嵌入到 Wasm 镜像中,而是在运行时挂载--help, -h
:显示帮助--version, -v
:打印版本你可以为生成的 wasm 镜像指定运行时标志,以配置执行(例如,更改在容器中运行的命令)。
用法:out.wasm [选项] [命令] [参数...]
[命令] [参数...]
:在容器中运行的命令。(默认:镜像配置中指定的命令)选项
-entrypoint <命令>
:入口点命令。(默认:镜像配置中指定的入口点)-no-stdin
:禁用标准输入。(默认:false)示例:
以下命令将容器的入口点更改为 echo
并将 hello
传递给参数。
wasmtime -- /app/out.wasm --entrypoint=echo hello
从主机映射的目录在容器中可访问。
$ mkdir -p /tmp/share/ && echo hi > /tmp/share/hi
$ wasmtime --mapdir /test/dir/share::/tmp/share /app/out.wasm ls /test/dir/share/
hi
尽管越来越多的编程语言开始支持 WASM,但在 WASM 上运行现有程序并不容易。 这有时需要重新实现和重新编译它们,并会增加额外的开发时间。 这是一个概念验证转换器,试图通过在 WASM 上运行未经修改的容器来解决这个问题。
container2wasm 创建一个在模拟 CPU 上运行容器和 Linux 内核的 WASM 镜像。
以下是技术细节:
tonistiigi/binfmt
安装的 QEMU 进行额外的模拟运行。sock_*
API。gvisor-tap-vsock
可用作网络栈。(文档:./examples/networking/
):heavy_check_mark: : 支持
:construction: : 进行中
注意:此处未列出的 WASI 功能未经测试(未来版本将支持更多功能)
运行时 | 标准输入输出 | 映射目录 | 网络 | 注意 |
---|---|---|---|---|
wasmtime | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: (使用主机端网络栈) | |
wamr(wasm-micro-runtime) | :heavy_check_mark: | :heavy_check_mark: | :construction: | |
wazero | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: (使用主机端网络栈 | |
wasmer | :construction: (不支持标准输入) | :heavy_check_mark: | :construction: | 非阻塞标准输入似乎不工作 |
wasmedge | :construction: (不支持标准输入) | :heavy_check_mark: | :construction: | 非阻塞标准输入似乎不工作 |
运行时 | 标准输入输出 | 映射目录 | 网络 | 注意 |
---|---|---|---|---|
wasmtime | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: (使用主机端网络栈) | |
wamr(wasm-micro-runtime) | :heavy_check_mark: | :heavy_check_mark: | :construction: | |
wazero | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: (使用主机端网络栈) | |
wasmer | :construction: (不支持标准输入) | :heavy_check_mark: | :construction: | 非阻塞标准输入似乎不工作 |
wasmedge | :construction: (不支持标准输入) | :heavy_check_mark: | :construction: | 非阻塞标准输入似乎不工作 |
有几个容器运行时支持运行 WASM 应用程序,但它们不在 WASM 上运行容器。
有一些模拟器支持在 WASM 上运行 Linux,但它们不支持 WASI。
WASM 上的 x86
WASM 上的 RISC-V
一些 WASM API 规范为应用程序提供了访问主机系统的能力。 需要重新编译(可能需要重新实现)应用程序。
./examples/
:示例(Python、PHP、浏览器上运行、网络等)vscode-container-wasm
:用于在浏览器上的 VSCode(如 github.dev
)运行容器的 VSCode 扩展,利用 container2wasm:https://github.com/ktock/vscode-container-wasm./extras/imagemounter
:一个辅助工具,用于在浏览器上分发和运行容器镜像,无需预先转换镜像。container2wasi 本身采用 Apache 2.0 许可,但生成的 WASM 镜像将包含第三方软件:
./patches/bochs
)中。Bochs 已被我们的项目修改以适用于容器./patches/tinyemu
)中。TinyEMU 已被我们的项目修改以适用于容器浏览器示例依赖以下软件:
browser_wasi_shim
(MIT 许可证或Apache 许可证 2.0):https://github.com/bjorn3/browser_wasi_shimgvisor-tap-vsock
(Apache 许可证 2.0):https://github.com/containers/gvisor-tap-vsockAI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。
一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作
AI办公助手,复杂任务高效处理
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解 决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号