はじめに
Dockerリソースとコードが同じリポジトリ管理になっている場合にVSCodeのDevContainerを使う時に、こんなことできたらいいのになぁ...がとりあえず達成できたので覚書です。
Dockerリソースとコードを同じリポジトリ管理にしてVSCodeのDevContainerを使うことで対峙した問題点
VSCodeからgitを利用する場合、VSCodeで開いているディレクトリ配下の.gitを参照することで使うことができます。
しかしながら、Dockerリソースとコードを同じリポジトリで管理し、コードをアプリケーション用のコンテナにマウントしてそのコンテナにVSCodeをアタッチして使用する場合、.gitはコンテナ側に無いため、VScode上からgit操作することができず、ホストマシンからgit操作をする等で対応する必要がありました。
(Docker(インフラ)関連を管理するリポジトリと、コードを管理するリポジトリを分ければいい話ではあると思いますが、それも面倒だったため解決させる方法が無いか探していました。)
イメージ的には下記のような感じです。
version: "3.8"
services:
php:
build:
context: .
dockerfile: Docker/php/Dockerfile
volumes:
- ./src:/var/www/html
↓VSCodeで開いているディレクトリ配下に.gitが無いため、gitを使うことができない

解決策
概要
コンテナの適当なディレクトリにリポジトリのルートディレクトリごとマウントさせて
コードの格納ディレクトリをシンボリックリンクを貼ることで対応します。
詳細
まずdocker-compose.yml等でリポジトリのルートディレクトリを適当なディレクトリ(今回は/usr/local/src配下とします)にマウントさせておきます。
version: "3.8"
services:
php:
build:
context: .
dockerfile: Docker/php/Dockerfile
volumes:
- ./:/usr/local/src ### プロジェクトルートごと/usr/local/srcにマウントさせる
続いてシンボリックリンクの設定をします
※シンボリックリンクを設定する先は各プロジェクトごと適切な位置に読み直してください
### 先に/var/www/htmlディレクトリが存在するので削除
$ rm -rf /var/www/html
$ ln -sb /usr/local/src/src/ /var/www/html
この例の場合、Dockerfileで以下のようにしておくのも可
RUN rm -rf /var/www/html \
&& ln -sb /usr/local/src/src/ /var/www/html
この状態で、VSCodeで開くディレクトリは/usr/local/srcを開いておくことで、開いたディレクトリ直下に.gitがある状態になるので、VSCodeからgitの操作ができるようになります。

おわりに
途中参画したプロジェクトでVSCodeだけで実装→git操作まで完結できるといいのになぁ...と悩んでいたところ、なんとか対応できて快適になりました!
自分の中でなんとなくこんな感じでいいかな?ぐらいの感じではありますので、
他にいい案等ありましたらコメント等お待ちしております![]()

