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