NeovimとDev Containerを使った開発環境の試行錯誤

先日 Devbox と、今さら感はあるが VSCode による Dev Container を使ってみた。 Devbox の Dev Container の設定を生成する機能によって、ローカルの Devbox 環境を簡単に Dev Container に持ち込むことができ、とても体験がよかった。

しばらく Devbox + VSCode + Dev Container で開発をしていたが、やはり VSCode ではなく Neovim を使いたいと思い試行錯誤したのでここにまとめる。

環境

挫折した方法

うまくいかなかった方法も書いておく。

Devbox + Neovim

まず試したのが、Devbox 環境に Neovim をインストールするアプローチ。 ただ、これはうまくいかなかった。
どうも、Devbox で使っている Nix では Neovim の設定が通常の Linux OS のように $HOME/.config/nvim に置くのではないようだ。(ちゃんと調べていない)

こちらのアプローチは早々に諦めた。

esensar/nvim-dev-container

最初は Devbox で生成した Dockerfile と devcontainer.json で試していたがうまくいかず。
Devbox が生成する Dockerfile には chown コマンドを実行する部分があるのだが、nvim-dev-container でビルドする際にこの chown コマンドが無視されており、そのせいでビルドに失敗していた。

後述する Open Devcontainer でも、Devbox が生成する Dockerfile のビルドは同じ理由で失敗した。

devcontainers/templates の Ubuntu でもビルドできなかったので、こちらのアプローチも諦めた。

成功した方法

Dev Container 環境で Neovim を自身の設定で動かすことに成功した方法を記す。
動作確認は devcontainers/templates の Ubuntu、devcontainers/images の Python で行なった。

なお、Devbox を使うことは諦めている。

Dev Container CLI

devcontainers/cliと、Neovim を使えるようにした Dockerfile を使う方法。

各プロジェクトでは、プロジェクトのルートにあらかじめ用意しておいた.devcontainer ディレクトリをコピーし、必要な設定を加えて利用するイメージ。

私が動作確認に使っていた Dockerfile と devcontainer.json は以下の通り。

Neovim の設定は、ローカルのものをコンテナにマウントする。

Dev Container CLI にはコンテナにアタッチする機能がないため、SSH を使ってコンテナ内に入る。 SSH の設定には Dev Container Features を使っている。

また、Dev Container CLI にはまだポートフォワード機能が実装されていないため、 appPort を使っている。

SSH のように Dev Container Features を使うか、プロジェクトにコピーした Dockerfile に追加することでプロジェクト固有のツールや設定を足すことができる。

コンテナ内に SSH 接続するスクリプトは、こちらを参考にした。
後述するリポジトリに含めているので参照いただきたい。

Open Devcontainer

Open Devcontainer は Dev Container の仕様に準拠しつつ、独自の機能が追加されている。
その 1 つが指定した dotfiles リポジトリの自動インストール機能である。

この方法では、この自動インストール機能を利用する。

Dec Container CLI を使う方法では、Neovim が入ったコンテナイメージにプロジェクト固有のツールや設定を追加するが、こちらでは各プロジェクトのコンテナイメージに Neovim とその設定を足すイメージ。

ポイントは、インストールスクリプトを install という名前で dotfiles リポジトリのルートに置き、実行権限をつけておくこと。

その上で、 odc run --dotfiles-repo <url of dotfiles repository> と実行すると、devcontainer.json で指定したイメージや Dockerfile からコンテナを作成したあとに、 install スクリプトを実行してくれる。

リポジトリの URL を以下のように $HOME/.config/odc.json に記述しておくと、 odc run のオプションを省略できる。

{
  "dotfiles-repo": "<url of dotfiles repository>"
}

Pros and Cons

Dev Container CLI を使う方法のメリット

Dev Container CLI を使う方法のデメリット

Open Devcontainer を使う方法のメリット

Open Devcontainer を使う方法のデメリット

さいごに

上記成功した方法に必要なファイルを含む Neovim の設定リポジトリを GitHub にホストした。

bridge-y/nvim: Neovim Configuration

Open Devcontainer を使う方法が気に入っているので、いまはこちらを使っている。
ちなみに、この取り組み中に Neovim の設定を lua 化した。