🐰

MoonBitをDockerコンテナ上で動かすための構成例

に公開

MoonBitは2025-06-18にベータ版を迎えた新しいプログラミング言語で、WebAssembly(WASM)で使うために特化した言語です。
WASMは今後1-2年でかなりの進化を遂げるはずです。その時MoonBitが注目を浴びる可能性が非常に高いので早いうちに触っておくと得をするかもしれませんね。
Playground環境も用意されていますが、「ローカルで動かしたい!」というあなたはまずDockerコンテナを使うのがいいでしょう。
なお、VSCodeのDevContainerやDevContainerCliを使っていません。

必要なもの

  • Docker

筆者の環境

  • Linux (Ubuntu 24.04)

ファイル構成

.
├── Dockerfile
└── docker-compose.yml

書き方のパターンについて

作るファイルは2ファイルですが、3パターンほど書き方を紹介します。

  1. 最小構成
    • MoonBitを動かすための最小限の構成です。環境差異は無いでしょう。
  2. ユーザー設定あり
    • ホストのユーザーID、グループIDを使ってコンテナ内にユーザーを作成します。ホストとファイルの権限が合わない問題を防ぎます。
    • Windowsでは動かないかと。
  3. Neovimをインストール
    • 私はよくコンテナにNeovimを入れて使っています。その書き方も紹介しますので参考にしてください。
    • gitはNeovimのプラグイン管理で必要になることが多いので入れています。
    • wl-clipboardはコンテナ内のクリップボードをホストと共有するために入れています。
    • Macでも動かないかと。

最小構成パターン

Dockerfile
FROM ubuntu:latest AS dev-container
WORKDIR /workspace

# 基本的なツールのインストール
RUN apt-get update && apt-get install -y \
    curl \
    && rm -rf /var/lib/apt/lists/*

# MoonBitをインストール
RUN curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

WORKDIR /workspace
docker-compose.yml
services:
  moonbit-dev:
    build:
      context: .
      dockerfile: Dockerfile
      target: dev-container
    command: sleep infinity
    volumes:
      # 現在のホストのフォルダをワークスペースにマウント
      - .:/workspace
      # MoonBitのキャッシュディレクトリ
      - moonbit-cache:/root/.moon

volumes:
  moonbit-cache:

ユーザー設定ありパターン

Dockerfile
FROM ubuntu:latest AS dev-container
WORKDIR /workspace

# 基本的なツールのインストール
RUN apt-get update && apt-get install -y \
    curl \
    && rm -rf /var/lib/apt/lists/*

# ユーザー設定
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG USERNAME=ubuntu

# 既存ユーザーチェックと作成
RUN if getent passwd $USER_ID > /dev/null 2>&1; then \
        USERNAME=$(getent passwd $USER_ID | cut -d: -f1); \
    else \
        if ! getent group $GROUP_ID > /dev/null 2>&1; then \
            groupadd -g $GROUP_ID $USERNAME; \
        fi && \
        useradd -u $USER_ID -g $GROUP_ID -m -s /bin/bash $USERNAME; \
    fi

USER $USER_ID

# MoonBitをインストール
RUN curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

WORKDIR /workspace
docker-compose.yml
services:
  moonbit-dev:
    build:
      context: .
      dockerfile: Dockerfile
      target: dev-container
      args:
        USER_ID: ${USER_ID:-1000}
        GROUP_ID: ${GROUP_ID:-1000}
    command: sleep infinity
    volumes:
      # 現在のホストのフォルダをワークスペースにマウント
      - .:/workspace
      # MoonBitのキャッシュディレクトリ
      - moonbit-cache:/home/ubuntu/.moon

volumes:
  moonbit-cache:

Neovimをインストールパターン

Dockerfile
FROM ubuntu:latest AS dev-container
WORKDIR /workspace

# 基本的なツールのインストール
RUN apt-get update && apt-get install -y \
    curl \
    neovim \
    git \
    wl-clipboard \
    && rm -rf /var/lib/apt/lists/*

# ユーザー設定
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG USERNAME=ubuntu

# 既存ユーザーチェックと作成
RUN if getent passwd $USER_ID > /dev/null 2>&1; then \
        USERNAME=$(getent passwd $USER_ID | cut -d: -f1); \
    else \
        if ! getent group $GROUP_ID > /dev/null 2>&1; then \
            groupadd -g $GROUP_ID $USERNAME; \
        fi && \
        useradd -u $USER_ID -g $GROUP_ID -m -s /bin/bash $USERNAME; \
    fi

USER $USER_ID

# MoonBitをインストール
RUN curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

WORKDIR /workspace
docker-compose.yml
services:
  moonbit-dev:
    build:
      context: .
      dockerfile: Dockerfile
      target: dev-container
      args:
        USER_ID: ${USER_ID:-1000}
        GROUP_ID: ${GROUP_ID:-1000}
    command: sleep infinity
    volumes:
      # 現在のホストのフォルダをワークスペースにマウント
      - .:/workspace
      # MoonBitのキャッシュディレクトリ
      - moonbit-cache:/home/ubuntu/.moon
      # ホストのNeovim 設定をコンテナ内にマウント(UID 1000のホームディレクトリに)
      - ~/.config/nvim:/home/ubuntu/.config/nvim:ro
      # Git設定の共有
      - ~/.gitconfig:/home/ubuntu/.gitconfig:ro
      # クリップボード共有用のソケット
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ${XDG_RUNTIME_DIR}/${WAYLAND_DISPLAY}:/tmp/${WAYLAND_DISPLAY}
    environment:
      # ホストとクリップボードの共有用(wl-clipboard)
      - DISPLAY=${DISPLAY}
      - WAYLAND_DISPLAY=${WAYLAND_DISPLAY}
      - XDG_RUNTIME_DIR=/tmp
    network_mode: host

volumes:
  moonbit-cache:

使い方

  1. 上記のいずれかのパターンでDockerfiledocker-compose.ymlを作成します。
  2. ターミナルでそのディレクトリに移動し、以下のコマンドを実行してコンテナを起動します。
    docker compose up moonbit-dev -d
    
  3. コンテナに入ります。
    docker compose exec moonbit-dev bash
    
  4. MoonBitのインストールが成功しているか確認します。
    moonbit --version
    
  5. 準備完了!
    moon new .
    
    を実行するとMoonBitプロジェクトが作成されて、ホスト側にも反映されます。新進気鋭のMoonBitをご堪能あれ!

Discussion