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!