CS/wasm

wasm 컨테이너 실행하기

아야는 못말려 2024. 11. 28. 23:18

wasm 컨테이너 이미지 생성하기

타겟 추가하기

rustup target add wasm32-wasip1

 

프로젝트 생성하기

cargo new http-server

 

설정 변경하기

[package]
name = "http-server"       # 프로젝트 이름
version = "0.1.0"          # 프로젝트 버전
edition = "2021"           # Rust 에디션

[dependencies]
tokio_wasi = { version = "1", features = ["rt", "macros", "net", "time", "io-util"]}
warp_wasi = "0.3.3"          # warp_wasi 의존성

 

코드 수정하기

// src/main.rs
use warp::Filter;

#[tokio::main(flavor = "current_thread")]
async fn main() {
    let hello = warp::get()
        .and(warp::path::end())
        .map(|| "Hello, World!");

    println!("Listening on http://0.0.0.0:8080");

    warp::serve(hello)
        .run(([0, 0, 0, 0], 8080))
        .await;
}

 

빌드하기

cargo build --target wasm32-wasip1 --release

 

잘 실행되는지는 wasmedge를 사용해서 실행해볼 수 있습니다. 먼저 wasmedge를 설치합니다.

curl https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash

 

그리고 wasmedge를 이용해서 실행해보도록 하겠습니다.

wasmedge target/wasm32-wasip1/release/http-server.wasm

 

실행 결과

 

 

이미지 빌드해보기

wasm을 컨테이너로 동작시키기 위해서 이미지를 빌드해야합니다. 

 

WebAssembly 모듈을 컨테이너 이미지로 패키징 

wasm-edge를 런타임으로 두고 실행하는 경우

FROM wasmedge/slim-runtime:0.10.1

COPY target/wasm32-wasip1/release/http-server.wasm /

CMD ["wasmedge", "--dir", ".:/", "/http-server.wasm"]

 

(다음에 해볼 예정) wasmedge가 컨테이너 런타임인 경우

FROM scratch

COPY target/wasm32-wasip1/release/http-server.wasm /

CMD ["/http-server.wasm"]

 

docker로 빌드한다면

docker build -t docker.io/unknown/wasm-demo-app:v1 .

 

buildah로 빌드한다면

buildah build -t wasm-demo-app:slim .

 

빌드 했을 때 워닝 뜨는 것

 

 

docker desktop (혹은 orbstack)으로 실행해보기

docker run -itd -p 8080:8080 \
  --name wasm-demo-app  docker.io/unknown/wasm-demo-app:v1