コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

docker-composeのコンテナ名のデフォルト名は「プロジェクト名-サービス名-インデックス番号」

Version2からルールが変更になったので、そもそもどういう挙動か調べる

挙動確認したバージョン

$ docker-compose --version
Docker Compose version v2.3.3

TL;DR

  • docker-composeで立ち上がるコンテナ名を明示的に指定しない場合 {{プロジェクト名}}-{{サービス名}}-{{インデックス番号}} となる。
  • 「プロジェクト名」は docker-composeの起動オプションで指定可能だが、ない場合は COMPOSE_PROJECT_NAME環境変数が使われる
  • COMPOSE_PROJECT_NAME は格別指定がない場合は起動ディレクトリの文字列が設定される

コンテナ名決定を司るソースコード

デフォルトのコンテナ名は以下のロジックで書かれている

func getContainerName(projectName string, service types.ServiceConfig, number int) string {
    name := strings.Join([]string{projectName, service.Name, strconv.Itoa(number)}, Separator)
    if service.ContainerName != "" {
        name = service.ContainerName
    }
    return name
}

from https://github.com/docker/compose/blob/v2/pkg/compose/convergence.go

明示的に service.ContainerName があればそれが入るが、ない場合は Separator で「プロジェクト名」「サービス名」「引数の番号」となる。このとき引数の番号は1から自動的に採番されるようになっている。

プロジェクト名とは

プロジェクト名は docker-compose -p で指定できるもの。ヘルプでは以下のような記述がある。

-p, --project-name NAME Specify an alternate project name (default: directory name)

ディレクトリ名がデフォルトになるとのことだが、これは環境変数COMPOSE_PROJECT_NAME との兼ね合いで設定されているもので、以下のような説明が公式ドキュメントにある。

この変数を設定するのは任意です。 変数を設定しなかった場合 COMPOSE_PROJECT_NAME のデフォルトは、プロジェクトディレクトリの basename となります。 コマンドラインオプション の -p も参照してください。 - Compose CLI 環境変数 — Docker-docs-ja 19.03 ドキュメント

コンテナ名を指定したい場合

指定したい場合はドキュメントにあるとおり container-name を使うと指定できる。ただし重複したコンテナ名があると立ち上がらないので注意が必要。

container_name: sukina-container-mei

デフォルト名はdocker-composeのv2から変わった

デフォルトのコンテナ名だが、昔は区切りが - ではなく _ であったが、docker-composeのversinが2になるときに変更になっている。

define compose container names with a valid hostname by ndeloof · Pull Request #8655 · docker/compose

これはhostnameとしてコンテナ名が使われるため、hostnameは _ を許容していないのでhostnameとして正しくつかえるようにするための変更だった様子。

関連リンク