🐳

devcontainerにgitconfigをdevcontainer.jsonだけで共有する

2024/04/29に公開

はじめに

ある日、IntelliJ + devcontainerの組み合わせで開発をしているとき、ふとdevcontainerの中でgit操作してみようと git commit してみると。。

Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

と怒られてしまいました。
以前、VSCode + devcontainerで開発しているときはこんなことなかったのになーと調べてみると、VSCodeでdevcontainerを利用するためのエクステンションDev Containersでは、 ~/.gitconfig を自動でコピーしてくれるとのこと。
そこで、今回はVSCodeに依存せずgitconfig、特にGitのユーザー情報をdevcontainerに設定する方法を考えます。

TL;DR

今回試した方法の要点は以下です。

  • initializeCommand で、ホストマシン上のGitユーザー情報を取得
  • postCreateCommand で、取得したGitユーザー情報をdevcontainer側で設定

設定方法

devcontainerの仕様では、Lifecycle scriptsというdevcontainerのライフサイクルの各フェーズの前後で実行する処理を定義することができます。
今回は、以下の2つのLifecycle scriptsを利用してGitユーザー情報をdevcontainerに設定します。

  • initializeCommand :コンテナ作成時およびコンテナ起動時を含むdevcontainerの初期化時にホストマシンで実行されるコマンド
  • postCreateCommand :devcontainerにユーザーがアタッチされたときにdevcontainer内で実行されるコマンド

initializeCommand

initializeCommand では、ホストマシンでコマンドが実行されるというのが味噌です。
initializeCommand には、以下のような処理を仕込みます。

  1. git config --get コマンドでGitユーザー情報を取得
  2. 取得したユーザー情報を .devcontainer/.env に書き込み

具体的には、まず以下のようなシェルスクリプト(initialize.sh)を用意して。

initialize.sh
#!/usr/bin/env bash

# create .env
cat <<-EOF > .devcontainer/.env
GIT_NAME=$(git config --get user.name)
GIT_EMAIL=$(git config --get user.email)
EOF

devcontainer.json で作成したシェルスクリプトを実行するよう設定、 .devcontainer/.env をdevcontainer内で環境変数として読み込むよう設定します。

devcontainer.json
{	
// ...
    "initializeCommand": "/bin/bash .devcontainer/scripts/initialize.sh",
// ...
    "runArgs": [
        "--env-file",
        ".devcontainer/.env"
    ]
}

ここまでで、devcontainerの中でホストマシンのGitユーザー情報が環境変数を介して利用できるようになります。

.devcontainer/.env は、gitignoreに記載しておきます。

postCreateCommand

postCreateCommand は、devcontainerを利用する直前に実行されるため、 initializeCommand で仕込んだ環境変数が利用できます。

そのため postCreateCommand には、 git config --global コマンドでGitユーザー情報を環境変数を利用して設定します。

具体的には、まず以下のようなシェルスクリプト(post-create.sh)を用意して。

post-create.sh
#!/usr/bin/env bash

git config --global user.name "${GIT_NAME}"
git config --global user.email "${GIT_EMAIL}"

devcontainer.json で作成したシェルスクリプトを実行するよう設定します。

devcontainer.json
{
// ...
    "postCreateCommand": "/bin/bash .devcontainer/scripts/post-create.sh",
// ...
}

これにより、Gitユーザー情報が設定されている状態でdevcontainerを利用し始められます。

まとめ

今回は、VSCodeに依存せずdevcontainerでGitユーザー情報を自動設定する方法について紹介しました。
これで、IntelliJ + devcontainerで快適に開発できるね!🥴

とはならず、devcontainerはVSCodeから切り離され独立した仕様になりましたが、まだまだVSCodeなしでは不便な部分が多い気がしています。
なので、devcontainerを利用する場合はおとなしくVSCode使っときましょう。

Discussion