用 Docker 工具管理 WebAssembly 應用程序

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開發者可以通過 DockerHub 和 CRI-O 等 Docker 工具在 WasmEdge 中部署、管理和運行輕量級 WebAssembly 應用程序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://github.com/WasmEdge/WasmEdge","title":"","type":null},"content":[{"type":"text","text":"WasmEdge","attrs":{}}]},{"type":"text","text":" 是由 ","attrs":{}},{"type":"link","attrs":{"href":"https://www.cncf.io/sandbox-projects/","title":"","type":null},"content":[{"type":"text","text":"CNCF (Cloud Native Computing Foundation) 託管的","attrs":{}}]},{"type":"text","text":" WebAssembly 運行時,是邊緣計算應用程序的執行沙箱。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然 WebAssembly 最初是作爲瀏覽器應用程序的運行時而發明的,但其輕量級和高性能的沙箱設計使其成爲通用應用程序容器的一個極具吸引力的選擇。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果在 2008 年已經有了 WASM + WASI,那麼我們壓根無需創始 Docker 這個項目了。 — Docker 聯合創始人 Solomon Hykes","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"與 Docker 相比, ","attrs":{}},{"type":"link","attrs":{"href":"https://www.infoq.com/articles/arm-vs-x86-cloud-performance/","title":"","type":null},"content":[{"type":"text","text":"WebAssembly 在啓動時快一百倍","attrs":{}}]},{"type":"text","text":", 佔用更小的內存和磁盤空間,並且具有更優定義的安全沙箱。然而,缺點是 WebAssembly 需要自己的語言 SDK 和編譯器工具鏈,使其作爲開發者環境比 Docker 更受限制。WebAssembly 越來越多地用於邊緣計算場景,通常這些場景中,部署 Docker 比較困難,或是應用程序的性能至關重要。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Docker 的一大優勢是其豐富的工具生態系統。我們希望爲 WasmEdge 開發者帶來類似 Docker 的工具。爲了實現這一點,我們爲 CRI-O 創建了一個名爲 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/second-state/runw","title":"","type":null},"content":[{"type":"text","text":"runw","attrs":{}}]},{"type":"text","text":" 的替代 runner 來加載並運行 WebAssembly 字節碼程序,如同他們是 Docker 鏡像文件一樣。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"在 CRI-O 中安裝 WebAssembly runner","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了在 CRI-O 中支持 WebAssembly,您只需下載 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"runw","attrs":{}}],"attrs":{}},{"type":"text","text":" 二進制碼發佈並將其安裝到您的 CRI-O 中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"runw","attrs":{}}],"attrs":{}},{"type":"text","text":" 二進制碼已經包括了 WasmEdge,無需單獨安裝 WasmEdge 或任何其它 WebAssembly VM。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,確保你使用的是安裝了 LLVM-10 的 Ubuntu 20.04。如果你使用的是不同的平臺,請參閱","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/second-state/runw#build-from-source","title":"","type":null},"content":[{"type":"text","text":"如何爲你的操作系統創建 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"runw","attrs":{}}],"attrs":{}},{"type":"text","text":" 項目文檔。","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"sudo apt install -y llvm-10-dev liblld-10-dev\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"確保你安裝了 ","attrs":{}},{"type":"link","attrs":{"href":"https://cri-o.io/","title":"","type":null},"content":[{"type":"text","text":"cri-o","attrs":{}}]},{"type":"text","text":"、 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/kubernetes-sigs/cri-tools","title":"","type":null},"content":[{"type":"text","text":"crictl","attrs":{}}]},{"type":"text","text":"、 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/containernetworking/plugins","title":"","type":null},"content":[{"type":"text","text":"containernetworking-plugins","attrs":{}}]},{"type":"text","text":" 和 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/containers/buildah","title":"","type":null},"content":[{"type":"text","text":"buildah","attrs":{}}]},{"type":"text","text":" 或者 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/docker/cli","title":"","type":null},"content":[{"type":"text","text":"docker","attrs":{}}]},{"type":"text","text":" 。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下一步,下載 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"runw","attrs":{}}],"attrs":{}},{"type":"text","text":" binary build","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"wget https://github.com/second-state/runw/releases/download/0.1.0/runw\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,你可以安裝 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"runw","attrs":{}}],"attrs":{}},{"type":"text","text":" 進 CRI-O 作爲 WebAssembly 的備選方案。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"# Get the wasm-pause utility\nsudo crictl pull docker.io/beststeve/wasm-pause\n\n# Install runw into cri-o\nsudo cp -v runw /usr/lib/cri-o-runc/sbin/runw\nsudo chmod +x /usr/lib/cri-o-runc/sbin/runw\nsudo sed -i -e 's@default_runtime = \"runc\"@default_runtime = \"runw\"@' /etc/crio/crio.conf\nsudo sed -i -e 's@pause_image = \"k8s.gcr.io/pause:3.2\"@pause_image = \"docker.io/beststeve/wasm-pause\"@' /etc/crio/crio.conf\nsudo sed -i -e 's@pause_command = \"/pause\"@pause_command = \"pause.wasm\"@' /etc/crio/crio.conf\nsudo tee -a /etc/crio/crio.conf.d/01-crio-runc.conf < i32 {\n let x: i32 = random();\n return x;\n}\n\npub fn get_random_bytes() -> Vec {\n let mut rng = thread_rng();\n let mut arr = [0u8; 128];\n rng.fill(&mut arr[..]);\n return arr.to_vec();\n}\n\npub fn echo(content: &str) -> String {\n println!(\"Printed from wasi: {}\", content);\n return content.to_string();\n}\n\npub fn print_env() {\n println!(\"The env vars are as follows.\");\n for (key, value) in env::vars() {\n println!(\"{}: {}\", key, value);\n }\n\n println!(\"The args are as follows.\");\n for argument in env::args() {\n println!(\"{}\", argument);\n }\n}\n\npub fn create_file(path: &str, content: &str) {\n let mut output = File::create(path).unwrap();\n output.write_all(content.as_bytes()).unwrap();\n}\n\npub fn read_file(path: &str) -> String {\n let mut f = File::open(path).unwrap();\n let mut s = String::new();\n match f.read_to_string(&mut s) {\n Ok(_) => s,\n Err(e) => e.to_string(),\n }\n}\n\npub fn del_file(path: &str) {\n fs::remove_file(path).expect(\"Unable to delete\");\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以通過下面的命令行將應用程序構建到一個 wasm 字節碼文件中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"rustwasmc build\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"wasm 字節碼文件 ","attrs":{}},{"type":"link","attrs":{"href":"https://github.com/second-state/wasm-learning/blob/master/ssvm/wasi/wasi_example_main.wasm","title":"","type":null},"content":[{"type":"text","text":"在這裏。","attrs":{}}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"爲 Wasm app 構建併發佈一個 Docker Hub 鏡像","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"您現在可以將整個 wasm 字節碼文件發佈到 Docker hub 中,就好像這是一個 Docker 鏡像一樣。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,在 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"pkg/","attrs":{}}],"attrs":{}},{"type":"text","text":" 目錄中創建一個 Dockerfile,如下所示。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"FROM scratch\nADD wasi_example_main.wasm .\nCMD [\"wasi_example_main.wasm\"]\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"創建一個鏡像併發布到 Docker hub。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"sudo buildah bud -f Dockerfile -t wasm-wasi-example\nsudo buildah push wasm-wasi-example docker://registry.example.com/repository:tag\n\n# Example: the following command publishes the wasm image to the public Docker hub under user account \"hydai\"\nsudo buildah push wasm-wasi-example docker://docker.io/hydai/wasm-wasi-example:latest\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,你可以使用 Docker 工具(例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"crictl","attrs":{}}],"attrs":{}},{"type":"text","text":")將發佈的 wasm 文件拉爲鏡像。 下面是我們發佈的 wasm 文件鏡像的示例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"sudo crictl pull docker.io/hydai/wasm-wasi-example\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"使用 CRI-O 啓動 Wasm app","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要啓動並運行 wasm 文件,您需要爲 CRI-O 創建兩個配置文件。 創建一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"container_wasi.json","attrs":{}}],"attrs":{}},{"type":"text","text":" 文件,如下所示。 它告訴 CRI-O 運行時應該從 Docker 存儲庫的哪裏提取 wasm 文件映像。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"{\n \"metadata\": {\n \"name\": \"podsandbox1-wasm-wasi\"\n },\n \"image\": {\n \"image\": \"hydai/wasm-wasi-example:latest\"\n },\n \"args\": [\n \"wasi_example_main.wasm\", \"50000000\"\n ],\n \"working_dir\": \"/\",\n \"envs\": [],\n \"labels\": {\n \"tier\": \"backend\"\n },\n \"annotations\": {\n \"pod\": \"podsandbox1\"\n },\n \"log_path\": \"\",\n \"stdin\": false,\n \"stdin_once\": false,\n \"tty\": false,\n \"linux\": {\n \"resources\": {\n \"memory_limit_in_bytes\": 209715200,\n \"cpu_period\": 10000,\n \"cpu_quota\": 20000,\n \"cpu_shares\": 512,\n \"oom_score_adj\": 30,\n \"cpuset_cpus\": \"0\",\n \"cpuset_mems\": \"0\"\n },\n \"security_context\": {\n \"namespace_options\": {\n \"pid\": 1\n },\n \"readonly_rootfs\": false,\n \"capabilities\": {\n \"add_capabilities\": [\n \"sys_admin\"\n ]\n }\n }\n }\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,創建一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sandbox_config.json","attrs":{}}],"attrs":{}},{"type":"text","text":" 文件,如下所示。 它定義了運行 wasm 應用程序的沙箱環境。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"{\n \"metadata\": {\n \"name\": \"podsandbox12\",\n \"uid\": \"redhat-test-crio\",\n \"namespace\": \"redhat.test.crio\",\n \"attempt\": 1\n },\n \"hostname\": \"crictl_host\",\n \"log_directory\": \"\",\n \"dns_config\": {\n \"searches\": [\n \"8.8.8.8\"\n ]\n },\n \"port_mappings\": [],\n \"resources\": {\n \"cpu\": {\n \"limits\": 3,\n \"requests\": 2\n },\n \"memory\": {\n \"limits\": 50000000,\n \"requests\": 2000000\n }\n },\n \"labels\": {\n \"group\": \"test\"\n },\n \"annotations\": {\n \"owner\": \"hmeng\",\n \"security.alpha.kubernetes.io/seccomp/pod\": \"unconfined\"\n },\n \"linux\": {\n \"cgroup_parent\": \"pod_123-456.slice\",\n \"security_context\": {\n \"namespace_options\": {\n \"network\": 0,\n \"pid\": 1,\n \"ipc\": 0\n },\n \"selinux_options\": {\n \"user\": \"system_u\",\n \"role\": \"system_r\",\n \"type\": \"svirt_lxc_net_t\",\n \"level\": \"s0:c4,c5\"\n }\n }\n }\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在可以創建一個 CRI-O pod 如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"# 創建 POD,輸出將會和示例不同。\nsudo crictl runp sandbox_config.json\n7992e75df00cc1cf4bff8bff660718139e3ad973c7180baceb9c84d074b516a4\n\n# 設置一個輔助變量供以後使用。\nPOD_ID=7992e75df00cc1cf4bff8bff660718139e3ad973c7180baceb9c84d074b516a4\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"自 pod ,您可以創建一個容器以隔離方式運行 wasm 字節碼程序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"# 創建容器實例,輸出將會和示例不同。\nsudo crictl create $POD_ID container_wasi.json sandbox_config.json\n1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,啓動容器並查看 wasm 應用程序的輸出。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"# 列出容器,狀態應該是 `Created`\nsudo crictl ps -a\n\nCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID\n1d056e4a8a168 hydai/wasm-wasi-example:latest About a minute ago Created podsandbox1-wasm-wasi 0 7992e75df00cc\n\n# 啓動容器\nsudo crictl start 1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f\n1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f\n\n# 再次檢查容器狀態。#如果容器沒有完成工作,你會看到運行狀態。 #因爲這個例子很小。此時您可能會看到 Exited。\nsudo crictl ps -a\nCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID\n1d056e4a8a168 hydai/wasm-wasi-example:latest About a minute ago Running podsandbox1-wasm-wasi 0 7992e75df00cc\n\n# 當容器完成。你能看到狀態變爲 Exited。\nsudo crictl ps -a\nCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID\n1d056e4a8a168 hydai/wasm-wasi-example:latest About a minute ago Exited podsandbox1-wasm-wasi 0 7992e75df00cc\n\n# 查看容器記錄 \nsudo crictl logs 1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f\n\nTest 1: 打印隨機數\nRandom number: 960251471\n\nTest 2: 打印隨機字節\nRandom bytes: [50, 222, 62, 128, 120, 26, 64, 42, 210, 137, 176, 90, 60, 24, 183, 56, 150, 35, 209, 211, 141, 146, 2, 61, 215, 167, 194, 1, 15, 44, 156, 27, 179, 23, 241, 138, 71, 32, 173, 159, 180, 21, 198, 197, 247, 80, 35, 75, 245, 31, 6, 246, 23, 54, 9, 192, 3, 103, 72, 186, 39, 182, 248, 80, 146, 70, 244, 28, 166, 197, 17, 42, 109, 245, 83, 35, 106, 130, 233, 143, 90, 78, 155, 29, 230, 34, 58, 49, 234, 230, 145, 119, 83, 44, 111, 57, 164, 82, 120, 183, 194, 201, 133, 106, 3, 73, 164, 155, 224, 218, 73, 31, 54, 28, 124, 2, 38, 253, 114, 222, 217, 202, 59, 138, 155, 71, 178, 113]\n\nTest 3: 調用 echo 函數\nPrinted from wasi: This is from a main function\nThis is from a main function\n\nTest 4: 打印環境變量\nThe env vars are as follows.\nPATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nTERM: xterm\nHOSTNAME: crictl_host\nPATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nThe args are as follows.\n/var/lib/containers/storage/overlay/006e7cf16e82dc7052994232c436991f429109edea14a8437e74f601b5ee1e83/merged/wasi_example_main.wasm\n50000000\n\nTest 5: 創建文件 `/tmp.txt` 包含內容 `This is in a file`\n\nTest 6: 從之前文件讀取內容\nFile content is This is in a file\n\nTest 7: 刪除之前文件\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"下一步","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在本文中,我們看到了如何使用類似 Docker 的 CRI-O 工具啓動、運行和管理 WasmEdge 應用程序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們的下一步是使用 Kubernetes 來管理 WasmEdge 容器。 爲此,我們需要在 Kubernetes 中安裝一個 runner 二進制文件,以便它可以同時支持常規 Docker 鏡像和 wasm 字節碼鏡像。 ","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://github.com/WasmEdge/WasmEdge","title":"","type":null},"content":[{"type":"text","text":"https://github.com/WasmEdge/WasmEdge","attrs":{}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章