🐧

devcontainer コマンドで devContainersSpecCLI が見つからないときの対処方法

2024/12/06に公開

はじめに

開発コンテナーを利用するための CLI ツールがあり、https://github.com/devcontainers/cli.git でオープンソースソフトウェアとして開発されています。この記事は、このツールを使おうとしたときに、エラーとなってしまったので、それを解決した方法について説明します。

結論を先に書いておくと、「正しく @devcontainers/cli をインストールしましょう」になります。

devcontainer コマンドのエラー

Ubuntu 22.04 で asdf の nodejs 環境で devcontainer/cli を使おうとしたところエラーになりました。

$ npm install -g devcontainers/cli

added 75 packages in 10s

5 packages are looking for funding
  run `npm fund` for details
npm notice 
npm notice New minor version of npm available! 10.5.2 -> 10.9.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.2
npm notice Run npm install -g npm@10.9.2 to update!
npm notice 
Reshimming asdf nodejs...

$ devcontainer --help
node:internal/modules/cjs/loader:1148
  throw err;
  ^

Error: Cannot find module './dist/spec-node/devContainersSpecCLI'
Require stack:
- /home/user001/.asdf/installs/nodejs/20.13.1/lib/node_modules/@devcontainers/cli/devcontainer.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
    at Module._load (node:internal/modules/cjs/loader:986:27)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/home/user001/.asdf/installs/nodejs/20.13.1/lib/node_modules/@devcontainers/cli/devcontainer.js:7:1)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/user001/.asdf/installs/nodejs/20.13.1/lib/node_modules/@devcontainers/cli/devcontainer.js'
  ]
}

Node.js v20.13.1

「あれ?」と思い、npm exec の方も実行してみました。

$ npm exec devcontainers/cli -- --help
Need to install the following packages:
github:devcontainers/cli
Ok to proceed? (y) y
node:internal/modules/cjs/loader:1148
  throw err;
  ^

Error: Cannot find module './dist/spec-node/devContainersSpecCLI'
Require stack:
- /home/user001/.npm/_npx/4d8f58e4a5483b87/node_modules/@devcontainers/cli/devcontainer.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
    at Module._load (node:internal/modules/cjs/loader:986:27)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/home/user001/.npm/_npx/4d8f58e4a5483b87/node_modules/@devcontainers/cli/devcontainer.js:7:1)
    at Module._compile (node:internal/modules/cjs/loader:1358:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/user001/.npm/_npx/4d8f58e4a5483b87/node_modules/@devcontainers/cli/devcontainer.js'
  ]
}

Node.js v20.13.1

同じエラーです。ということで、なぜか Cannot find module './dist/spec-node/devContainersSpecCLI' というエラーが出てしまいます。

何がよくないのかわからず、asdf で使用する nodejs のバージョンを変えたりしてみましたが、それでもうまくいきませんでした。

仕方がないので asdf のものはすべてアンインストールして、nodesource の PPA を登録して最新の node 23.2.0 をインストールしました。このとき sudo npm install -g yarn で yarn もインストールしました。

そうしてから、devcontainers/cli をインストールしてみましたが、同じ結果になりました。

devContainersSpecCLI の用意

要するに、devContainersSpecCLI がないからエラーになるのだから、自分で用意すれば良いのだろうと考えて、リポジトリをクローン。

git clone https://github.com/devcontainers/cli.git

これを yarn でコンパイルすれば良いのですが、Ubuntu 22.04 環境ではコンパイルができませんでした。幸い、開発コンテナーがついているので、VS Code で cli を開きます。

code cli

「再度、開発コンテナーで開く」といった通知が表示されるので、ボタンをクリックして開発コンテナーで開きます。cli が開発コンテナーで開かれたら、https://github.com/devcontainers/cli にある手順にしたがってコンパイル。

yarn
yarn compile

これで、Docker ホストの clidist ディレクトリーが作成されるので、それを /usr/lib/node_modules/@devcontainers/cli/ へコピーします。これで devcontainer コマンドが使えるようになりました。

$ sudo cp -r dist /usr/lib/node_modules/@devcontainers/cli/
$ devcontainer --help
devcontainer <command>

Commands:
  devcontainer up                   Create and run dev container
  devcontainer set-up               Set up an existing container as a dev container
  devcontainer build [path]         Build a dev container image
  devcontainer run-user-commands    Run user commands
  devcontainer read-configuration   Read configuration
  devcontainer outdated             Show current and available versions
  devcontainer upgrade              Upgrade lockfile
  devcontainer features             Features commands
  devcontainer templates            Templates commands
  devcontainer exec <cmd> [args..]  Execute a command on a running dev container

Options:
  --help     Show help                                                                                         [boolean]
  --version  Show version number                                                                               [boolean]

devcontainer@0.72.0 /usr/lib/node_modules/@devcontainers/cli

ちなみに devcontainer コマンドが使える環境なら、cli の開発コンテナーは次のコマンドで起動できます。

devcontainer up --workspace-folder cli

これで cli 用の開発コンテナーが起動するので、VS Code の Docker 拡張機能の画面を開き、cli のコンテナーを右クリックし、表示されるメニューにある「Visual Studio Code をアタッチする」とすれば、VS Code で cli の開発ができます。

このようにして、開発コンテナーをコマンドラインから起動できるようになります。

何が問題だったのか

さて、解決はしたのですが、「最新バージョンだと問題が起きるのかな?」と思って、もう少し調べることにしました。問題が起きているなら開発元へレポートしたいところです。

ということで、この後、次の手順を試してみたところ、0.71.0 は dist がきちんとインストールされました。

sudo npm uninstall -g @devcontainers/cli
sudo npm install -g @devcontainers/cli@0.71.0

さらに、次の手順を試してみたところ、バージョン 0.72.0 がインストールされ、今度は dist がきちんとインストールされました。

sudo npm uninstall -g @devcontainers/cli
sudo npm install -g @devcontainers/cli

ということで、「最初のときにうまくいかなかった理由がよくわかりません。」と書こうとしていて気が付きました。コマンドでインストールしようとしているパッケージが違いますね... @ が抜けていると動かないのです。

npm install -g devcontainers/cli

正しくは、下記なのですね。

npm install -g @devcontainers/cli

エラーメッセージから、この間違いを想像することはできませんでした。やれやれです (^^;

Discussion