仕事において、コンテナ内からGithubに対してssh接続をしたいケースが発生しました。その際、とりあえずChatGPTに聞いてみるのはどうかな?と思い早速使ってみました。結果的には嘘をついたりするので素直には解決しなかったのですが、まあこれはこれで非常に勉強になりました。特に弊部署には先輩と言える先輩がいないため、自然とこの子に聞くことが多くなるんだろうなと思う次第。

それでは本題に入ります。まず、ChatGPTくんは英語が得意なので英語で質問を入力することにしています。そうした方が精度もスピードも断然良いです。下記が会話になります。

最初の質問。英語に自信があるわけではないので、間違ったら訂正するように指定。
その後、どうやったらコンテナからGithubにSSHで繋げられるかを質問している。
Github側で公開鍵の登録をしないとSSHできないため、コンテナを作り直すたびにssh-keygenをするとすごく手間である。これを解決したい。

上記に対するchatGPTくんの回答はこちら

英文ちょっと間違っているから直すね&毎回ssh-keygenせずにコピーしてきちゃえばいいんだよという回答
上記コマンドによって、確かにコンテナ内にもホストで準備された秘密鍵が共有される。
確かにうまく行きそうだし、ご丁寧にセキュリティ的な懸念まで示唆してくれている。

ここまでの会話で、「確かにホストと共有したボリュームにしてしまえば行けるじゃん」と納得してしまいました。このあとにぶつかる大きな問題にも気づかずに….。ちなみにこのときは英語の回答を読み間違えて、コンテナ間でもssh通信するのかな?と思い素っ頓狂な質問もしています。

というわけで、コンテナ間通信をするときも、
①まずはホストでそれ専用の鍵を作っておく
②コンテナへ送付する
のが良いという回答

ChatGPTくんすごい!と思う一方で、ここの6番の回答で「そういえば。。。」となりました。SSH関連のファイルは権限管理がとても厳密で600とか400じゃないと動作しないんじゃなかったかな?そういえばDockerコンテナ内のユーザはホストのルートでは無いから、600とかに指定されてしまうと書き込めないのでは?

そしてChatGPTくんとの戦いが始まった。

まず、質問する前に確認(研究者の基本)
自分の認識に間違いが無いこと、相手がやっぱり権限については気をつけろと言っていることを確認。

ここで実際にChatGPTの言うとおりにコンテナを試しに作ってみて、SSHできるか試してみました。その際、known_listが更新できない(権限が無いため)という問題に早速ぶつかりました。下記がChatGPTくんとのやり取りです。

前半は間違った推測をしてはいるが、一応有益な情報。
後半に権限が不正だと出る旨が回答されているので、なんとなく合ってはいそう。
ここも非常に良い回答であるため、一見間違いに気づきにくい

キャプションでは解説が難しいため、ここでは本文に問題点を書いていきます。
まず、解決手順そのものは非常に妥当です。鍵が正しいかを確認し、その権限が合っているか確認する、この動きは間違っていないと思います。ただし、確認方法が今回の本題になります。コンテナの中から見ると確かに権限は合っています。しかし、これはコンテナのルートユーザを基準にした権限ではなく、ホストのルートユーザを基準としているため、コンテナのルートユーザには書き込み権限が無いです。つまり、この手順に沿って見ていっても解決できないのです。少しコーナーケースだと性能が落ちるのかも知れない・・・。

ちょっと答えを書いてみて反応を伺う様子
あなたの言うとおりですね。コピーしないとですね!と回答しつつ共有ボリュームを推してくる。
何もわかっていないのでは?
ただし、後半になるとそれなりに成立しそうな回答をするのが卑怯である。

そんなこんなで、

  1. ホストでssh-keygenしておき
  2. それをDockerfileでCOPYしてコンテナに配置し
  3. 最後に権限を直す

こんな感じで解決していくことになりました。以降はDockerfile内にどうやって現在のユーザのホームディレクトリ(通常~や$HOME)を記載するかについて、質問しています。これはsshのデフォルト保存先が~/.ssh/であることに起因しています。

ちなみにこの回答、全くの嘘です。ひどい話です。全然これでは機能してくれないので注意。

尤もらしく書いているので騙されてしまいましたが、実際にやってみるとことごとく失敗します。そこで、ChatGPTくんに事実を伝えました。

AI相手でも低姿勢で対応してしまう筆者の図。
もう少し堂々と生きたい気持ちもある。

ということで、docker buildコマンドには –build-argsオプションがあり、これで指定できる変数はDockerfileであらかじめARGで指定できるのでいかが?と返ってきました。確かにこれは使えそう!ありがとうChatGPT!

結果的には他の鍵がおいてある~/.ssh/を明示的に指定するのも怖かったので、build argを使用しない方法で実装することになった。ただ、知識がついたのでこういう試行錯誤のお供にChatGPTは最高だね!という結論にします。

これからもよろしく!ChatGPTくん。
そして、ここまで読んでくださった辛抱強い皆様に感謝!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です