WASM with WASI
WASI offers a way to use Web Assembly as a container, for secure remote deployment.
Building a WASI project is quite familiar:
cargo new wasm_hello_world
Then edit the main.rs
file:
// Import rust's io and filesystem module
use std::io::prelude::*;
use std::fs;
// Entry point to our WASI applications
fn main() {
// Print out hello world!
println!("Hello world!");
// Create a file
// We are creating a `helloworld.txt` file in the `/helloworld` directory
// This code requires the Wasi host to provide a `/helloworld` directory on the guest.
// If the `/helloworld` directory is not available, the unwrap() will cause this program to panic.
// For example, in Wasmtime, if you want to map the current directory to `/helloworld`,
// invoke the runtime with the flag/argument: `--mapdir /helloworld::.`
// This will map the `/helloworld` directory on the guest, to the current directory (`.`) on the host
let mut file = fs::File::create("/helloworld/helloworld.txt").unwrap();
// Write the text to the file we created
write!(file, "Hello world!\n").unwrap();
}
To actuall build the project you need to install the WASI target:
rustup target add wasm32-wasi
And add a dependency to your project:
cargo add wasmtime
You can then build it with:
cargo build --target wasm32-wasi
To execute WASI projects locally, use wasmtime
. You can install WASMTime by going to https://wasmtime.dev/ and following the instructions there. Typically, just run (on Linux or MacOS):
curl https://wasmtime.dev/install.sh -sSf | bash
Finally, you can run the WASI program inside the wasmtime
host:
wasmtime --mapdir /helloworld::. target/wasm32-wasi/debug/wasi_hello_world.wasm
If all went well, a file was created. You are running a wasm
binary in a container!