Docker DesktopのWASMサポートを試してみる
こちらのページを参考にdocker desktop上のWASMを試してみる。
WASMをサポートするのはDocker Desktop 4.15から。
containerd image store を有効にする
設定 → Experimental
で
Use containerd for pulling and storing images
をオンにする。
サンプルを動かしてみる
ここのサンプルを動かしてみる。
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と同じレイヤーだということがわかる。
docker composeでの起動
続いてdocker compose。
docker-compose.ymlを用意する。
services:
app:
image: michaelirwin244/wasm-example
platform: wasi/wasm32
runtime: io.containerd.wasmedge.v1
ports:
- 8080:8080
そしてこれで立ち上げる。
docker compose up
Wasm でマルチサービス アプリケーション
サンプル落としてきて
git clone https://github.com/second-state/microservice-rust-mysql.git
対象リポジトリで実行
docker compose up
エラーになった
=> [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
for target 'wasm32-was'; did you mean 'wasm32-wasi'?
「'wasm32-was'なんて知らない。'wasm32-wasi'の間違いじゃないか?」と怒られている。
もしやと思いソースを確認するも'wasm32-wasi'としっかり書かれてる。
うーんどうしたものかと悩んだ末、Dockerfileの改行コードをCRLFからLFに変えたら治った。
Windowsはこれだから困る。
動いた!
8080じゃなくて8090のポートでアクセスする必要があるのがちょっとした罠だった。
Rustで書いたmariaDBにアクセスするWebサーバーのコードが動いてる!凄い!
WASIってもっと原始的なものだと思ったけど、アプリケーションのレイヤーを書く時はほとんど何も意識せずに何でも動くのかな。
これはWASMの時代思ったより早くるのでは。