2024.01.19
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
こんにちは!のすけです。
Dockerではコンテナを作成するときに名前を指定しないと、自動でちょっと奇妙な名前がつきます。
例
少し調べてみてランダムな 形容詞+著名な学者 のような形式になっていそうな雰囲気は感じつつ
今まで深く気にせずにいました。
が最近ふと名前の候補になっているのがどういった人達かなど
気になってきたので調べました。
とりあえず固有名詞が使われていることから、Githubでコード検索したら生成箇所が簡単に見つけられそうだと思い
検索してみたところ実際簡単に見つけられました。
どうやら以下のファイルで名前を生成しているようです。https://github.com/moby/moby/blob/24.0/pkg/namesgenerator/names-generator.go
コードの最初の方で
形容詞と、人名の激長配列が変数として定義されていて
これが生成する名前のもとになっています。
初期のコミットのコメントによると
この人名の配列に含まれているのは著名な発明者の名前らしいです。
著名な発明者名の配列では
各要素ごとにコメントが書いてあり
元となった人のフルネームと簡易的な説明、wikipediaへのリンクが記載されています。
この手の人名を元にした命名では、だいたい科学者・数学者の偉人の名前が使われる印象があるのですが(チューリング、テスラ、フェルミ等)
がっつり存命の、お馴染みの有名プログラマーの方々の名前が載っていて印象的でした。(Linus Torvaldsさん、まつもとゆきひろさん等)
結構知らない人の名前が載っていてどういう人なのか調べると面白いです。
で何とはなしコードを眺めていたところ様子のおかしな記述を見つけました。
func GetRandomName(retry int) string { begin: name := left[rand.Intn(len(left))] + "_" + right[rand.Intn(len(right))] //nolint:gosec // G404: Use of weak random number generator (math/rand instead of crypto/rand) if name == "boring_wozniak" /* Steve Wozniak is not boring */ { goto begin } if retry > 0 { name += strconv.Itoa(rand.Intn(10)) //nolint:gosec // G404: Use of weak random number generator (math/rand instead of crypto/rand) } return name }
名前が “boring_wozniak” になった場合は生成し直しらしいです。(なぜならスティーブ・ウォズニアックさんは退屈じゃないため)
「この偉人・著名人辞典みたいなリストに退屈な人なんているんだろうか……?」と思いつつも
急にひょうきんな一面を見せてくるDockerに動揺を禁じ得ません。
またこのファイル”names-generator.go” があるディレクトリ下には
“names-generator_test.go“というテスト用のファイルがあります。
最新のバージョンだと普通の内容ですが
元が元なので、テストも何かありそうだと色々確認したところ
昔のバージョンに様子がおかしかった頃の名残を見つけました。
// Make sure the generated names are awesome func TestGenerateAwesomeNames(t *testing.T) { name, err := GenerateRandomName(&FalseChecker{}) if err != nil { t.Error(err) } if !isAwesome(name) { t.Fatalf("Generated name '%s' is not awesome.", name) } } // To be awesome, a container name must involve cool inventors, be easy to remember, // be at least mildly funny, and always be politically correct for enterprise adoption. func isAwesome(name string) bool { coolInventorNames := true easyToRemember := true mildlyFunnyOnOccasion := true politicallyCorrect := true return coolInventorNames && easyToRemember && mildlyFunnyOnOccasion && politicallyCorrect }
関数isAwesomeあたり、
引数で生成した名前を受け取るも結局使わなかったり
処理も
かっこいい発明者の名前で( := true)
覚えやすくて( := true)
ちょっと笑えて( := true)
政治的に正しい( := true)
からヨシ!( return true && true && true && true )
と結局trueしか返さない内容になっていたりと
中々凄みを感じます。
(ちなみにこのテストはコミットコメント曰く
“コンテナ名のすばらしさを確認するための単体テスト“とのことです。)
(またこの部分、結局無くなってはいるのですが追加されてからCleanupされるまで約2年半残っているので意外と息が長いです。)
そんな感じでDockerみたいな物凄くメジャーなソフトウェアにジョークコード的なものが含まれていたりいなくなったりしているようで、これが結構意外でした。
案外憎めないところがあるんですねDocker……
最初はどういった人たちの名前がコンテナ名に使われているか等を確認する目的で調べ始めたのですが
そちらの衝撃がすごくて気づいたら終始その事ばかり調べてしまいました。
結果Dockerの開発者の方々に妙な親近感みたいなものを持てたような気がするので何やかんや良かったのかもしれません……
おわり!
・雑記
https://github.com/moby/moby/commit/971cf56d89ac9cc4959800bdfaadb69ba2cdd06a
最初はランダムなコンテナ名生成には、色と動物名の組み合わせが使われていたようです。
https://github.com/moby/moby/commit/5d6ef3177b57371c2dd9b9e4253fbc326d072554
ここで人名に変更。
https://github.com/moby/moby/commit/04f5c75239cba156db70523bcd90657e5c7b5ddb
スティーブ・ウォズニアックさんは退屈じゃない判定爆誕。
https://github.com/moby/moby/blob/24.0/pkg/namesgenerator/names-generator.go
“names-generator.go”の上部のコメントによると
形容詞とか人物リストのメンテナンスのコストが必要以上にかかるため現在このパッケージは公式に凍結されているようです。
存命の著名人の名前を使うのって大丈夫なんだろうかと少し思ったのですが
普通にそのリスクの影響を受けていました。
変更履歴を見ると確かに人名の追加・削除とかが結構されている様子がうかがえます。(何なら凍結後も例外的にリストの一部が削除されたりしてる)