先决条件
运行WebAssembly是一个测试版功能,需要使用containerd。要启用containerd,请转到Docker Desktop仪表板,然后单击“设置>开发中的功能> Beta功能>使用containerd存储和提取镜像”。
在本机构建
cargo new wasm-docker-example
fn main() {
println!("Hello, world!");
}
rustup target add wasm32-wasi
cargo build --target wasm32-wasi --release
-rwxr-xr-x 1 Justin staff 2093838 6 19 17:39 wasm-docker-example.wasm
构建简单的Docker镜像
FROM rust:1.70-slim-bullseye as build
COPY Cargo.toml .
COPY Cargo.lock .
COPY src src
RUN rustup target add wasm32-wasi
RUN cargo build --target wasm32-wasi --release
FROM scratch
COPY --from=build /target/wasm32-wasi/release/wasm-docker-example.wasm wasm.wasm
ENTRYPOINT [ "/wasm.wasm" ]
1,从一个Rust Docker映像开始
2,添加WASM目标
3,构建Webassembly
4,从scratch开始使用多级构建。
5,复制上一阶段生成的Webassembly文件
docker build -f Dockerfile-wasm -t docker-wasm:1.0 .
docker run --runtime=io.containerd.wasmedge.v1 docker-wasm:1.0
Hello, world!
FROM rust:1.70-slim-bullseye as build
COPY Cargo.toml .
COPY Cargo.lock .
COPY src src
RUN RUSTFLAGS='-C target-feature=+crt-static' cargo build --release
FROM scratch
COPY --from=build /target/release/wasm-docker-example native
从scratch开始构建镜像并生成二进制文件。
docker build -f Dockerfile-native -t docker-native:1.0 .
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-native 1.0 f48a37ac1a66 6 seconds ago 7.32MB
docker-wasm 1.0 332c53bb03e0 5 minutes ago 2.61MB
构建复杂的Docker镜像
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1.28", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use reqwest::get;
#[tokio::main(flavor = "current_thread")]
async fn main() {
match get("http://httpbin.org/get").await {
Ok(response) => {
let result = response.json::<GetBody>().await;
match result {
Ok(json) => {
println!("{:#?}", json);
}
Err(err) => {
println!("{:#?}", err)
}
}
}
Err (err) => {
println!("{:#?}", err)
}
}
}
#[derive(Debug, Serialize, Deserialize)]
struct GetBody {
args: HashMap<String, String>,
headers: HashMap<String, String>,
origin: String,
url: String,
}
docker build -f Dockerfile-wasm -t docker-wasm:1.1 .
docker run --runtime=io.containerd.wasmedge.v1 docker-wasm:1.1
GetBody {
args: {},
headers: {
"X-Amzn-Trace-Id": "Root=1-64905d7f-2371d2807e7f74780d60ab96",
"Host": "httpbin.org",
"User-Agent": "Go-http-client/1.1",
"Accept": "*/*",
},
origin: "103.82.4.2",
url: "http://httpbin.org/get",
}
总结