Open9

Docker DesktopのWASMサポートを試してみる

kurehajimekurehajime

containerd image store を有効にする

設定 → Experimental

Use containerd for pulling and storing images
をオンにする。

kurehajimekurehajime

サンプルを動かしてみる

ここのサンプルを動かしてみる。

docker run -dp 8080:8080  --name=wasm-example --runtime=io.containerd.wasmedge.v1  --platform=wasi/wasm32  michaelirwin244/wasm-example

localhost:8080にアクセスしてみると、動いてる事がわかる。

--platformオプションにはwasi/wasm32を指定している。よくあるパターンは--platform linux/x86_64だが、この場合はwasiというOSをwasm32で動かしてる、みたいな位置づけになってるのかな。wasiはOSでは無い気もするが、まぁよし。

--runtimeオプションは普段あまり指定しないが、公式ブログの図を見るとwasmedgeはruncと同じレイヤーだということがわかる。

kurehajimekurehajime

docker composeでの起動

続いてdocker compose。

docker-compose.ymlを用意する。

docker-compose.yml
services:
  app:
    image: michaelirwin244/wasm-example
    platform: wasi/wasm32
    runtime: io.containerd.wasmedge.v1
    ports:
      - 8080:8080

そしてこれで立ち上げる。

docker compose up
kurehajimekurehajime

Wasm でマルチサービス アプリケーション

サンプル落としてきて

git clone https://github.com/second-state/microservice-rust-mysql.git

対象リポジトリで実行

docker compose up
kurehajimekurehajime

エラーになった

 => [buildbase 2/4] WORKDIR /src                                                                                   1.1s
 => ERROR [buildbase 3/4] RUN <<EOT bash                                                                           0.6s
------
 > [buildbase 3/4] RUN <<EOT bash:
: invalid optionine 1: set: -
#0 0.441 set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
#0 0.446 E: Invalid operation update
#0 0.453 Reading package lists...
#0 0.462 Building dependency tree...
#0 0.463 Reading state information...
#0 0.466 E: Unable to locate package
' is not a git command. See 'git --help'.
#0 0.469
#0 0.469 The most similar commands are
#0 0.469        am
#0 0.469        gc
#0 0.469        mv
#0 0.469        rm
#0 0.470 bash: line 5: $'clang\r': command not found
#0 0.574 error: toolchain '1.64.0-x86_64-unknown-linux-gnu' does not contain component 'rust-std' for target 'wasm32-was'; did you mean 'wasm32-wasi'?
#0 0.574 note: not all platforms have the standard library pre-compiled: https://doc.rust-lang.org/nightly/rustc/platform-support.html
------
failed to solve: process "/bin/sh -c <<EOT bash\n    set -ex\r\n    apt-get update\r\n    apt-get install -y \\\r\n        git \\\r\n        clang\r\n    rustup target add wasm32-wasi\r\nEOT" did not complete successfully: exit code: 1
kurehajimekurehajime

for target 'wasm32-was'; did you mean 'wasm32-wasi'?

「'wasm32-was'なんて知らない。'wasm32-wasi'の間違いじゃないか?」と怒られている。
もしやと思いソースを確認するも'wasm32-wasi'としっかり書かれてる。

うーんどうしたものかと悩んだ末、Dockerfileの改行コードをCRLFからLFに変えたら治った。
Windowsはこれだから困る。

kurehajimekurehajime

動いた!

8080じゃなくて8090のポートでアクセスする必要があるのがちょっとした罠だった。