Dockerコンテナのおもしろい名前

Dockerコンテナを立ち上げるときに,--nameオプションで名前を指定しないと勝手に名前がつけられる.

$ docker run -d dockerfile/nginx
$ docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
1f29f753eaf6        dockerfile/nginx:latest   nginx               2 days ago          Up 11 hours         80/tcp, 443/tcp     elegant_feynma

例えば,上ではelegant_feynmaという名前がつけられている.

で,これどうやってやってるのかなーと思ってソースを眺めていると,docker/pkg/namesgeneratorというパッケージが名前を生成していた.

名前の生成方法はとても単純で,49個の形容詞と68名の著名な科学者もしくはハッカーの名前をランダムに組み合せているだけ.ソースを見ると,科学者もしくはハッカーの名前と簡単な紹介文,wikipediaへのリンクがコメントに書かれている.

以下が,生成部分の実装.注意深くみると,異変に気づく.

func GetRandomName(retry int) string {
    rand.Seed(time.Now().UnixNano())

begin:
    name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])
    if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
        goto begin
    }

    if retry > 0 {
        name = fmt.Sprintf("%s%d", name, rand.Intn(10))
    }
    return name
}

この実装のIssueはここにある.まあ,LGTMである.

このnamegeneratorパッケージはDocker以外でも使えるようになっている.例えば以下のように使う.

package main

import (
    "fmt"
    "github.com/dotcloud/docker/pkg/namesgenerator"
)

func main() {
    fmt.Println(namesgenerator.GetRandomName(0))
}    

便利ー.

参考