仕事において、コンテナ内からGithubに対してssh接続をしたいケースが発生しました。その際、とりあえずChatGPTに聞いてみるのはどうかな?と思い早速使ってみました。結果的には嘘をついたりするので素直には解決しなかったのですが、まあこれはこれで非常に勉強になりました。特に弊部署には先輩と言える先輩がいないため、自然とこの子に聞くことが多くなるんだろうなと思う次第。
それでは本題に入ります。まず、ChatGPTくんは英語が得意なので英語で質問を入力することにしています。そうした方が精度もスピードも断然良いです。下記が会話になります。
上記に対するchatGPTくんの回答はこちら
ここまでの会話で、「確かにホストと共有したボリュームにしてしまえば行けるじゃん」と納得してしまいました。このあとにぶつかる大きな問題にも気づかずに….。ちなみにこのときは英語の回答を読み間違えて、コンテナ間でもssh通信するのかな?と思い素っ頓狂な質問もしています。
ChatGPTくんすごい!と思う一方で、ここの6番の回答で「そういえば。。。」となりました。SSH関連のファイルは権限管理がとても厳密で600とか400じゃないと動作しないんじゃなかったかな?そういえばDockerコンテナ内のユーザはホストのルートでは無いから、600とかに指定されてしまうと書き込めないのでは?
そしてChatGPTくんとの戦いが始まった。
ここで実際にChatGPTの言うとおりにコンテナを試しに作ってみて、SSHできるか試してみました。その際、known_listが更新できない(権限が無いため)という問題に早速ぶつかりました。下記がChatGPTくんとのやり取りです。
キャプションでは解説が難しいため、ここでは本文に問題点を書いていきます。
まず、解決手順そのものは非常に妥当です。鍵が正しいかを確認し、その権限が合っているか確認する、この動きは間違っていないと思います。ただし、確認方法が今回の本題になります。コンテナの中から見ると確かに権限は合っています。しかし、これはコンテナのルートユーザを基準にした権限ではなく、ホストのルートユーザを基準としているため、コンテナのルートユーザには書き込み権限が無いです。つまり、この手順に沿って見ていっても解決できないのです。少しコーナーケースだと性能が落ちるのかも知れない・・・。
そんなこんなで、
- ホストでssh-keygenしておき
- それをDockerfileでCOPYしてコンテナに配置し
- 最後に権限を直す
こんな感じで解決していくことになりました。以降はDockerfile内にどうやって現在のユーザのホームディレクトリ(通常~や$HOME)を記載するかについて、質問しています。これはsshのデフォルト保存先が~/.ssh/であることに起因しています。
ちなみにこの回答、全くの嘘です。ひどい話です。全然これでは機能してくれないので注意。
尤もらしく書いているので騙されてしまいましたが、実際にやってみるとことごとく失敗します。そこで、ChatGPTくんに事実を伝えました。
ということで、docker buildコマンドには –build-argsオプションがあり、これで指定できる変数はDockerfileであらかじめARGで指定できるのでいかが?と返ってきました。確かにこれは使えそう!ありがとうChatGPT!
結果的には他の鍵がおいてある~/.ssh/を明示的に指定するのも怖かったので、build argを使用しない方法で実装することになった。ただ、知識がついたのでこういう試行錯誤のお供にChatGPTは最高だね!という結論にします。
これからもよろしく!ChatGPTくん。
そして、ここまで読んでくださった辛抱強い皆様に感謝!