危険な方法でdevcontainer内からgit push等できるようにする
大変便利なdevcontainerですが、少しだけ不便なところがあります。
それは、ssh_keyがホストとコンテナで共有されないため、devcontainer内からgit push等の操作ができないことです。
本来であれば、ssh-agentを利用して安全に鍵を共有する必要があるのですが、Windowsではssh-agentが少しややこしかったりします。
(参考: https://qiita.com/slotport/items/e1d5a5dbd3aa7c6a2a24)
めんどくさいからとりあえずgit pushだけさせてくれ!時間がないんだ!!
という方のために、危険ですがすぐにdevcontainer内でgit pushできるようにする方法があります。
何度も言いますが、これは危険な方法です。ローカルのdevcontainer内だけに収まるならまだ良いですが、何かの拍子に秘密鍵が外界に触れてしまうと大変なことになります。
自分が何をしているかを理解し、十分に危険性を理解した上で秘密鍵は慎重に取り扱ってください
やり方
以下のような記述をdevcontainer.jsonに加えます
{
(...)
"postCreateCommand": "cat .git_ssh_key > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa"
}
前提として、以下のdocker-compose.ymlのようにホストのディレクトリがDevContainer内の作業ディレクトリにマウントされている必要があります。
version: "3"
services:
app:
(...)
volumes:
- .:/workspace
- ssh-key:/root/.ssh
volumes:
ssh-key:
上記の条件を満たした状態で、ホスト側のターミナルで以下のコマンドを実行します。
Mac/Linux
echo .git_ssh_key >> .gitignore
cat ~/.ssh/id_rsa > .git_ssh_key
Windows
echo .git_ssh_key >> .gitignore
type %homepath%\.ssh\id_rsa > .git_ssh_key
上記コマンドを実行後、DevContainerをリビルドします。
すると、DevContainer内でgit push等ができるようになります。
仕組み解説
端的に言うと、ホストマシンの秘密鍵をDevContainer内の~/.sshにコピーしています。
devcontainer.jsonに追加した"postCreateCommand"
という記述ですが、これはDevContainerを生成(ビルド)したときに、コンテナ内で指定したコマンドを実行できるオプションです。
これを利用して、ホストマシンから受け取った秘密鍵をDevContainer内の~/.sshにコピーしています。
ホストマシンから秘密鍵を渡す際には、ホストマシンの~/.sshにあるid_rsaファイルを作業ディレクトリにコピーし、DockerComposeのディレクトリマウント経由で渡しています。
上記コマンドでは.gitignoreに秘密鍵のファイルを指定してgitの管理下に置かれないようにしていますが、実際に試す際には非常に慎重に厳重にgitの管理下に置かれていないことを確認してください。
何度も言いますが、絶対に秘密鍵を外界に触れさせないでください。
おわり
素直にssh-agent使いましょう。