📘

Dockerコンテナ内からホスト上のgit操作をできるようにした話

2024/02/21に公開
2

前提

  • Docker上に開発環境を整備
  • ソースコードは、ホスト側にgit clone等で配置し、それをコンテナにマウントして利用
treeで表現するとこう
.
|_ .git
|_ src <-- dockerにはこれだけをマウントしている
  • 利用中のGitリポジトリとは、SSH経由ではなくBASIC認証を用いてログインしている

モチベ

  • 開発環境に.gitを含まないフォルダをマウントした際、ホストで作業する際は利用できるgitコマンドによる操作がコンテナで利用できない
    • バージョン管理だけでなく、pre-commitなども効かなくなりとても不便
  • 何とかしてコンテナからgitを操作したい!

模索

レアなケースなのか、ググり方がだめなのかなかなか解決策が見つからず、
最近はやりのAIにすがってみました

AIに聞いてみた

Dockerコンテナからホストの.gitを使用するためには、
Dockerのボリュームマウントを使用する必要があります。
次の手順で操作することができます。

1. Dockerコンテナの起動時に、ホストの.gitディレクトリを、
   コンテナ内の適切な場所にマウントします。
   例えば、以下のようなコマンドを使用します。

   docker run -v /path/to/.git:/usr/src/app/.git <イメージ名>

   ここで、/path/to/.gitはホストの.gitディレクトリのパスを指定し、
   <イメージ名>は使用するDockerイメージの名前を指定します。

2. マウントされた.gitディレクトリにアクセスするために、
    Dockerコンテナ内でGitを設定します。以下のコマンドを使用します。

    git config --global --add core.excludesFile /usr/src/app/.git/info/exclude

    これにより、コンテナ内のGitがホストの.gitを使用するようになります。

これにより、Dockerコンテナからホストの.gitを使用してgit操作を行うことができます。
ただし、.gitディレクトリは慎重に操作する必要がありますので、
適切な注意を払って操作してください。

なるほど、ホスト側の.gitを、コンテナ(ここでは/usr/src/app/.git)にマウントしてあげればよく、
さらにおまじないのようなコマンドを実行する模様

実践

docker runでコンテナを起動
docker run \
-i -t \
-v /path/to/src:/usr/src/app \
-v /path/to/.git:/app/.git \
<something image>
docker内からgit logを試す
docker exec -it <container_id> bash
$ git log
fatal: detected dubious ownership in repository at '/usr/src/app'
To add an exception for this directory, call:

        git config --global --add safe.directory /usr/src/app

おや、何やらfatalエラーが。
調べてみると、.git以下の所有権が怪しいことになってしまったとのこと。

AIに聞いてみた その2
このメッセージは、Gitが`.git/info/exclude`ファイル内で指定されたディレクトリに関して、
所有権に関して疑わしい点を検出した場合に表示されます。
これは、Gitがディレクトリの所有権が正しく設定されていないことを検出したことを意味しています。

このメッセージが表示される理由は、通常次のようなケースです。

1. ファイルやディレクトリの所有者が変更された場合:
`.git/info/exclude`ファイルに指定されているディレクトリの所有者が、
Gitの実行ユーザーと一致しない場合に表示されます。

2. `.git/info/exclude`ファイルが変更された場合:
`.git/info/exclude`ファイルが最近編集され、
Gitの実行ユーザーと一致しないディレクトリが指定された場合に表示されることがあります。

このメッセージが表示された場合は、`.git/info/exclude`ファイル内のディレクトリの所有権を確認し、
必要に応じて修正してください。
Gitの実行ユーザーと一致するように設定することで、この警告メッセージを回避することができます。
ただし、セキュリティ上の理由から、適切な所有者の設定に注意する必要があります。

今回は諸事情で、ホストのユーザーとコンテナのユーザーのUID等が食い違う状況があるため、
その辺が関係しているのかも(要検証)

とりあえず今回は示されたコマンドを実行することにします。

$ git config --global --add safe.directory /usr/src/app
$ git log
> commit xxxxxxxxxxxxxxxxx (hogehoge)
> Author: xxxxxxx <xxxxx>
> Date:   xxxxxxx
> 
>    xxxxxxxxxxxx

これで、コンテナからgit logを参照できるようになりました。

これならいろいろ捗りそうです。

参考まで

FYI

今では、以下のようなSSH接続方式パターンが主流のようです。

VSCode公式が推すやり方であること、
GitHubでBASIC認証が実質使えなくなる未来が待っていること、
それらを踏まえるならこちらについて併せてキャッチアップしておくといいと思われました

Sharing Git credentials with your container

【GitHub活用メモ】GitHubの認証をSSH接続方式にしてみる(Dockerコンテナ対応済)
Visual Studio CodeのRemote ContainersからもGitを使う方法

Discussion

はやしはやし

まさに探していた事柄でした!
単純に疑問なのですが,皆さんコンテナ内からローカルのgitをいじらないものなのでしょうか?
コンテナのディレクトリをgit管理は何となくしたくないような気がするのでローカルでgit管理をしたいのですが,行ったり来たりがめんどくさく感じます.
一般的にはどのような運用がされているのでしょうかね...

user_thebigsleeuser_thebigslee

はやしさん

お役に立てたのであれば幸いです!

VSCodeのRemoteContainerなどを用いて、コンテナ内で作業することが割と普通になってきたので、実務でも出番がありそうなユースケースなんですが、情報があまりなかったんですよね。。