devcontainer コマンドで devContainersSpecCLI が見つからないときの対処方法
はじめに
開発コンテナーを利用するための 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 ホストの cli
に dist
ディレクトリーが作成されるので、それを /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