[⬇️下载] [📖 命令参考] [📚 附加文档] [▶️演示]
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-vsock

AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省 将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。