開発ノート@HarikoApps

HarikoApps: https://hariko.sprkls.me

2024-08-24

VS CodeでDev Containerを使い始めた #18

VS CodeにDev Container機能なるものがあることは知っていて何度かセットアップしようとしたことがありました。ただ導入したいプロジェクトがフロントエンドとバックエンドのモノレポ(Multi Root)構成のプロジェクトということもあり短時間ではうまくいかずでほぼあきらめかけていたんですが、連休で時間が取れたので改めて本腰を入れてセットアップしてみました。

Dev Containerとは?

最近のプロジェクトだとローカル環境のセットアップを必要とせず開発環境を立ち上げられるように専用のコンテナが使われることが多いですが、VS Code Serverなどエディタサーバのホストとしてこうしたコンテナを使える仕様になります。概念としてはサーバ(コンテナ)にsshで繋いでviのようなエディタを立ち上げるような形に近いですが、サーバ側で動くのはVS Code Serverになり、UIとなるクライアントはそのままローカルで動作するのでそのままのGUIで操作できてネットワーク遅延の影響を受けにいという違いがあります。GitHub Codespacesでも利用されています。

Dev ContainerはVS Code特有の機能というわけではなくオープンな仕様として公開されているものということです。Overviewにも書いてありますがコンテナを用いてソースコードの編集などを行うためのツール群を定義するためのメタデータ仕様(devcontainer.json)ということなのかな、と思います(良く理解できてない)。なのでVS Code以外のエディタでもこの仕様をサポートできれば対応可能になります。他にIntelliJなどが対応しているようです。

メリット

下記のような利点があります。

  • ソースファイル編集時にコンテナ内部のシェルをローカルのシェルのように扱える
    • `docker-compose exec` などのプレフィクスが必要なくなって楽
  • Gitやsshなど基本的なツールもDev Containerがコンテナ内にセットアップしてくれるのでローカル環境と同様に扱える
  • コンテナ内部のランタイムやLinterなどのツールをソースコード編集時にローカル環境のように扱うことができる
  • 動作確認環境と同様にファイル編集環境もコンテナで統一的にセットアップでき、開発環境の準備が楽になる

例えばコンテナのホストOSがMacであってもLinuxのコンテナを使ってファイル編集でき、ホストOSにrubyをインストールしなくてもコンテナ内のrubyを用いてruby-lspやrubocopなどのツールを動作させられて便利です。

Rails7.2からはDev Containerがオプトインとなっていて簡単にRailsプロジェクト用のものをセットアップすることができるようになっています。こちらも少し使ってみたのですがスムーズにセットアップできました。

役立ったリファレンスや記事

すでに有用なリファレンスや解説記事があるのでリンクしておきます。

設定でつまづいた箇所

最初は仕組みがほとんど理解できていなかったので五里霧中でしたが、概要についてある程度理解して既存のDockerコンテナを再利用できるものであることがわかると後は比較的順調でした。

ただやはりMulti Rootのプロジェクトでさらにdocker-composeが使われていることで設定が難しくなり時間がかかってしまいました。これはMulti Rootのworkspaceファイルを定義した上で上記リファレンスにもあるdocker-composeの上書き設定を行うことで解決できました。

あと、コンテナのベースイメージがDebian系でない場合は使えないFeature(Dev Containerに機能を追加できる仕組み)が多いなど、いくつかの制限があります(筆者の場合はAlpineでこうした問題に当たりました)。IntelliJだとそもそもDebian系でないとコンテナ立ち上げが不可能でした。ベースイメージは特に理由がなければslimなどのDebian系Linuxを使うと良さそうです。

使い始めてどうか?

1週間と少しDev Containerで仕事をしてみました。Docker環境にはOrbStackを使っていますが、たまにI/Oの遅さを感じることはあるもののかなり快適に使えています。特に開発環境という、今まで逐一手作業でセットアップしていた環境を宣言的に再現可能な形で記述しておけるため安心感があります。

Codespacesでも使えるかなと思って試してみたのですが、立ち上げにcode-workspaceファイルや.envのファイルなど、リポジトリにコミットしていないファイルが必要なようでうまくいっていません。この辺りはもう少し調べてみたい。
Updated at