いしぐめも

プログラミングとかしたことを書きます。

devcontainerを別リポジトリで管理することにした

先日、開発にdevcontainerを使用するという以下の記事を書きました。

yoh1496.hatenablog.com

とても便利なんですが、作ってみたはいいものの、「devcontainer」という機能自体がVisual Studio Codeの1機能に過ぎないので、 複数人が様々な環境で開発するオープンソースプロジェクトでおいそれと導入するわけにはいかず、 このコンテナを定義したフォルダをどのように管理するか? という悩みがありました。

そこで考えたのが リポジトリ です。

従来の考え方

この考え方は個人的な誤解によるものなんですが、「.devcontainerはソースコードと同じフォルダになければならない。」と考えていました。

ソースコードAを開発する際に開くコンテナはコレ、と指定するのが.devcontainerフォルダの役割だと思っていたため、ぐぬぬ、となっていました。

変更後

複数プロジェクトに分かれるJavaコードをどうやってdevcontainerで開発するんだ?となったんですが、コンテナへのソースコードのバインドは、 docker-compose のボリュームでマウントしているにすぎない ので、複数書けばよく、また、なんなら同じフォルダである必要がない、ということに気づきました。

よって以下のようなフォルダ構成を前提とし、

━┳━ 📁project-main-dev ← devcontainerがあるフォルダ
 ┣━ 📁project-main
 ┗━ 📁project-lib

devcontainerで使用する docker-compose.devcontainer.yml を以下のように変更しました。

version: "3.7"

services:
  project-dev:
    volumes:
      # プロジェクトをフォルダごとマウントする
      - ../../project-main:/workspace/project-main:cached
      - ../../project-lib:/workspace/project-lib:cached
      # ワークスペースファイルもマウントする
      - ../dev.code-workspace:/workspace/dev.code-workspace
      # テストに使用する資材フォルダをマウントする
      - ../project-test-folder:/project-test-folder
      # キャッシュフォルダ
      - m2_cache:/root/.m2
    command: /bin/sh -c "while sleep 1000; do :; done"

volumes:
  m2_cache:
    driver: local

複数ソースコード

上記のように変更することで、コンテナ内のフォルダは以下のようになります。

━ 📁workspace
  ┣━ 📁project-main
  ┣━ 📁project-lib
  ┗━ 📃dev.code-workspace

こうなれば、通常通り複数フォルダにまたがった開発をコンテナ内で行えばよいので、従来通り開発ができます。

ワークスペースファイル

devcontainer.jsoncode-workspace 拡張子のファイルを指定するとワークスペースを開くことができることがわかりました。(これ公式にサポートされている機能なのかは謎)

ちなみにワークスペースはこんな感じ

{
  "folders": [
    {
      "name": "project-main",
      "path": "/workspace/project-main"
    },
    {
      "name": "project-lib",
      "path": "/workspace/project-lib"
    }
  ]
}

こうすることで、2フォルダを開いた状態でvscodeが立ち上がります。

キャッシュとかテスト用資材とか

mavenのキャッシュ用に /root/.m2 フォルダにボリュームをマウントしてみました(rootで起動するのやめたいなぁとおもいつつ)。今のところちゃんとキャッシュきいてそうです。

あとは、テスト用に必要なフォルダをマウントするようにしました。例えば、決まった絶対パスからプラグインをロードしたりするテストの場合、手元の環境を使用すると確実に環境を汚してしまいますが、コンテナであれば自由にフォルダをマウントできるので便利ですね。

テスト用のフォルダを作成して、中身は .gitignore に指定して、必要な資材をボンボン放り込んでいけばいいだけなので非常に簡単です。

終わりに

ここまでの内容を下記リポジトリに格納しています。

GitHub - yoh1496/personium-engine-dev: devcontainers for developing personium-engine

「Remote - SSH」とは併用できませんが、WSL2からdockerを使用する場合も、Windowsからdockerを使用する場合もとても快適に開発できるようになったのでオススメです。

次は開発ユーザー周りを何とかしたいなぁと思ってます。