はじめに
サービス開発、特にAPIをコンパイル言語で構築する場合、Dev Containersを用いると便利である。しかし、モノレポ構造でサービスを開発している場合、.gitリポジトリが親ディレクトリに存在することでVSCodeがリポジトリを認識しない。gitコマンドを利用する際にVSCodeをLocalでReOpenし対応可能だが、現実的でない。
今回はモノレポ構造の開発環境でDev Containerを用いた際にGitでバージョン管理を行う方法についてまとめる。
ディレクトリ構造
開発を行うにあたり、ディレクトリ構造の抜粋を以下に示す。
root/
├ .git
├ .devcontainer/
│ └ devcontainer.json
├ backend/
│ └ build
│ └ package
│ └ Dockerfile
└ docker-compose.yml
docker-compose.yml
利用するdocker-compose.yml
のサンプルを以下に示す。
version: "3.6"
services:
api:
build:
context: ./backend/build/package
dockerfile: Dockerfile
ports:
- 8080:8080
volumes:
- .:/go/src
working_dir: /go/src/backend
tty: true
上記したdocker-compose.ymlはプロジェクトのルートディレクトリをコンテナにマウントしている。Dev Containersのリファレンスより、プロジェクトのルートディレクトリをマウントし、WorkingDirを指定することでGit管理が可能になる。
devcontainer.json
次に、Dev Containersのサンプル設定ファイルを以下に示す。
{
"dockerComposeFile": ["../docker-compose.yml"],
"service": "api",
"workspaceFolder": "/go/src/backend",
"postAttachCommand": "git config --global --add safe.directory /go/src",
"customizations": {
"vscode": {
"settings": {
"git.openRepositoryInParentFolders": "always"
},
"extensions": [
"golang.Go",
]
}
}
}
上記のdevcontainer.jsonはdocker-compose.ymlを参照して設定を行っている。ここで重要になってくるのがpostAttachCommand
とgit.openRepositoryInParentFolders
である。
まず、postAttachCommandにはgit config --global --add safe.directory /go/src
コマンドを指定し、プロジェクトのルートディレクトリをsafe.directoryに指定する。この設定を行わない場合Unsafe Repositories
となり自動でリポジトリを認識しない。
次にgit.openRepositoryInParentFoldersだが、その名の通り親ディレクトリの.gitディレクトリを認識させるための項目である。今回はalwaysにし、コンテナ内でVSCodeを開く際に毎回認識するよう設定している。
まとめ
本記事ではモノレポ構造のサービス開発において、Dev Containerを用いる際にGit管理を行う方法をまとめた。詳しいdocker-compose.ymlファイルの記載方法やDev Containersの設定については公式サイトを確認してほしい。
では、良いエンジニアライフを。