devcontainer上でもmiseのツールをそのまま使いたい

VSCodeのdevcontainerを使う場合、コンテナ内にもmise.tomlで定義したツールをインストールする仕組みが必要になる。mise generate devcontainerは、mise向けのdevcontainer featureを組み込んだdevcontainer.jsonを生成するコマンドである。

基本の使い方

引数なしで実行すると、標準出力にdevcontainer.jsonの内容を出力する。

$ mise generate devcontainer
{
  "name": "mise",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers-extra/features/mise:1": {}
  },
  "customizations": {
    "vscode": {
      "extensions": [
        "hverlin.mise-vscode"
      ]
    }
  },
  "mounts": [],
  "containerEnv": {},
  "remoteEnv": {}
}

featuresghcr.io/devcontainers-extra/features/mise:1を組み込むことで、コンテナ起動時にmise自体がインストールされ、mise.tomlに定義したツールも解決される。customizations.vscode.extensionsには、mise用のVSCode拡張機能hverlin.mise-vscodeもあわせて設定される。

–imageでベースイメージを変更する

デフォルトのベースイメージはmcr.microsoft.com/devcontainers/base:ubuntuである。--imageで別のベースイメージに変更できる。

$ mise generate devcontainer --image mcr.microsoft.com/devcontainers/javascript-node:20

–nameでdevcontainer名を変更する

--nameで、生成するdevcontainer.jsonnameフィールドを変更できる。指定しない場合はmiseになる。

$ mise generate devcontainer --name my-project

–mount-mise-dataでインストール済みツールを永続化する

--mount-mise-dataを付けると、mise用のDockerボリュームmise-data-volumeをコンテナにマウントし、インストール済みツールをコンテナの再作成後も保持できるようにする。

$ mise generate devcontainer --mount-mise-data
{
  "name": "mise",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers-extra/features/mise:1": {}
  },
  "customizations": {
    "vscode": {
      "extensions": [
        "hverlin.mise-vscode"
      ]
    }
  },
  "mounts": [
    {
      "source": "mise-data-volume",
      "target": "/mnt/mise-data",
      "type": "volume"
    }
  ],
  "containerEnv": {
    "MISE_DATA_DIR": "/mnt/mise-data"
  },
  "remoteEnv": {
    "PATH": "${containerEnv:PATH}:/mnt/mise-data/shims"
  },
  "postCreateCommand": "sudo chown -R vscode:vscode /mnt/mise-data"
}

mountsにボリューム定義が追加されるだけでなく、MISE_DATA_DIRをボリュームのマウント先に向けるcontainerEnv、shimsをPATHに通すremoteEnv、ボリュームの所有者を調整するpostCreateCommandもあわせて設定される。コンテナを再作成するたびにツールを再インストールしたくない場合に使える。

–writeで.devcontainer/devcontainer.jsonに書き込む

--writeを付けると、標準出力の代わりに.devcontainer/devcontainer.jsonへ直接書き込む。

$ mise generate devcontainer --write
Wrote to /path/to/project/.devcontainer/devcontainer.json

既に.devcontainer/devcontainer.jsonが存在する場合も、確認なしでそのまま上書きされる。上書きして問題ないか事前にファイルの中身を確認しておくとよい。

なお、gitリポジトリ以外のディレクトリで--writeを実行するとfatal: not a git repositoryという警告を表示する場合がある。この場合もdevcontainer.json自体は問題なく書き込まれる。