devcontainerにgitconfigをdevcontainer.jsonだけで共有する
はじめに
ある日、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 には、以下のような処理を仕込みます。
-
git config --getコマンドでGitユーザー情報を取得 - 取得したユーザー情報を
.devcontainer/.envに書き込み
具体的には、まず以下のようなシェルスクリプト(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内で環境変数として読み込むよう設定します。
{
// ...
"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)を用意して。
#!/usr/bin/env bash
git config --global user.name "${GIT_NAME}"
git config --global user.email "${GIT_EMAIL}"
devcontainer.json で作成したシェルスクリプトを実行するよう設定します。
{
// ...
"postCreateCommand": "/bin/bash .devcontainer/scripts/post-create.sh",
// ...
}
これにより、Gitユーザー情報が設定されている状態でdevcontainerを利用し始められます。
まとめ
今回は、VSCodeに依存せずdevcontainerでGitユーザー情報を自動設定する方法について紹介しました。
これで、IntelliJ + devcontainerで快適に開発できるね!🥴
とはならず、devcontainerはVSCodeから切り離され独立した仕様になりましたが、まだまだVSCodeなしでは不便な部分が多い気がしています。
なので、devcontainerを利用する場合はおとなしくVSCode使っときましょう。
Discussion