docker『Invalid Container Name』の原因と対処法

docker『Invalid Container Name』の原因と対処法

「Invalid container name」「invalid name for container」といったエラーは、docker run や docker create、docker-compose などで指定したコンテナ名が、Dockerの命名規則に違反しているときに発生する。使えない文字・スペース・長すぎる名前・既存コンテナとの重複・改行や環境変数展開のミスなど、意外と細かい落とし穴が多い。コンテナ名のルールを整理し、エラーになりやすいパターンを押さえておくと、名前周りのトラブルを避けやすくなる。

エラーの意味と発生条件

「Invalid container name」は、Dockerデーモンが受け取ったコンテナ名を検証した結果、以下のような条件に引っかかったときに出る。

・名前に禁止文字(スペース、日本語、一部の記号など)が含まれている。

・長さの上限を超えている。

・フォーマット(先頭文字、連続ハイフンなど)が規則から外れている。

・すでに存在するコンテナ名と重複している。

・docker-compose などのツールが内部で組み立てた名前が規則違反になっている。

エラーの直前に叩いたコマンドと名前の中身を確認すると、原因が見つかりやすい。

Dockerコンテナ名の命名ルールを整理する

コンテナ名は、ざっくり次のようなルールに従う。

・使える文字:小文字 a-z、数字 0-9、ハイフン(-)、アンダースコア(_)、ドット(.)。

・先頭は英小文字または数字。

・スペースや日本語、スラッシュ(/)、コロン(:)、特殊記号(@, $, # など)はNG。

・内部的には /name のように先頭にスラッシュが付くが、ユーザー指定では書かない。

# OK例
docker run --name web1 nginx
docker run --name my-app_01 nginx

# NG例
docker run --name "my app" nginx       # スペース
docker run --name "マイコンテナ" nginx   # 日本語
docker run --name "app/01" nginx       # スラッシュ

ログやエラーメッセージに「invalid container name “xxx”」と表示されたら、その “xxx” を上のルールと照らし合わせて確認する。

スペース・日本語・特殊記号が原因のパターン

一番多いのが「人間の気持ちいい名前」を付けようとしてスペースや日本語を入れてしまうパターン。

# NG
docker run --name "my app" nginx
docker run --name 開発環境 nginx
docker run --name app#01 nginx

# OK: ハイフン・アンダースコアで区切る
docker run --name my-app nginx
docker run --name dev-app nginx
docker run --name app_01 nginx

docker-compose.yml でも同様で、container_name にスペースや日本語を入れるとエラーになる。

# NG
services:
  app:
    image: myorg/app
    container_name: "my app"     # スペース入り

# OK
services:
  app:
    image: myorg/app
    container_name: my-app

既存コンテナとの重複が原因のパターン

コンテナ名はユニークである必要があり、同じ名前のコンテナがすでに存在すると new create / run 時にエラーになる。メッセージは「Conflict. The container name … is already in use」などになるが、ツール側のラッパーでは「Invalid Container Name」にまとめて出る場合もある。

# 先にコンテナが動いている
docker run -d --name web nginx

# 同じ名前で起動しようとするとNG
docker run -d --name web nginx   # → 名前の競合エラー

対処法は次のいずれか。

・既存コンテナを削除 or リネームしてから再作成。

・別の名前を付けて作成。

# 既存コンテナを停止・削除
docker stop web
docker rm web

# 名前を変えて作成
docker run -d --name web2 nginx

既存コンテナの一覧を確認するときは、ps ではなく ps -a や docker container ls -a で止まっているコンテナも含めて見ると分かりやすい。

環境変数展開のミス(空文字や改行が紛れ込むパターン)

CI/CD やシェルスクリプトで環境変数からコンテナ名を組み立てる場合、変数の値が空だったり改行を含んでいると、「見た目は正しいが実際はおかしい」名前になってしまう。

# NG: NAME が空、または改行付き
NAME="$(cat name.txt)"   # name.txt の末尾に改行
docker run --name "$NAME" nginx

# 実際には "my-app\n" のようになっており invalid 扱い

# OK: トリムしてから使う
NAME="$(tr -d '\n\r' < name.txt)"
docker run --name "$NAME" nginx

# デバッグ: 実際の中身を確認
printf 'name=[%s]\n' "$NAME"

変数が空のときにはデフォルトを使うようにしておくと安全。

CONTAINER_NAME="${CONTAINER_NAME:-my-app}"
docker run --name "$CONTAINER_NAME" nginx

docker-compose での service 名・container_name の扱い

docker-compose を使うと、指定しなくても「プロジェクト名サービス名番号」という形式でコンテナ名が自動生成される。このとき、サービス名やプロジェクト名が規則に合っていないと、内部で組み立てた名前が invalid になる。

# NG例: サービス名にスペースや大文字を使う
services:
  Web App:          # スペース入り
    image: myorg/app

# NG例: プロジェクト名にスペースが入ったディレクトリで実行
# ディレクトリ名: "My Project"
docker compose up

# OK例: サービス名は小文字とハイフン・アンダースコアで
services:
  web_app:
    image: myorg/app

# プロジェクト名を明示指定して安全な名前にする
# docker-compose.ymlと同じディレクトリで
docker compose -p myproject up -d

container_name を明示する場合も上で示した文字ルールに従う。compose 側が勝手に修正してくれるわけではないので注意。

コンテナ名の長さ・構造制限に引っかかるケース

非常に長いコンテナ名や、複数の記号を不自然に連続させた名前は invalid と見なされることがある。環境によって上限は若干異なるが、運用上は「せいぜい30〜60文字程度」に収めておくと安心。

# NG: 長すぎる + 不自然な構造
docker run --name my-super-long-container-name-with-too-many-sections-and-symbols nginx

# OK: 短めで意味が通る単位に分ける
docker run --name web-api nginx
docker run --name web-api-v1 nginx

また、内部的に先頭スラッシュが付く (/web-api など) が、ユーザーが / から始まる名前を与えると invalid と判定される。

# NG
docker run --name /web-api nginx

# OK
docker run --name web-api nginx

ツールやライブラリが組み立てる名前が壊れているケース

docker SDK(Go / Python)や各種ツールが内部でコンテナ名を組み立てる場合、そのコードにバグや変数混入があると invalid name が生成される。

Go SDK の例:

containerName := fmt.Sprintf("%s-%s", projectName, serviceName)
// projectName にスペースや大文字が入っているとNG

Python SDK の例:

client.containers.run(
    "nginx",
    name="My App",   # スペース入り→NG
)

ツール利用時に Invalid container name が出たら、

・ライブラリのバージョン更新。

・ツール側の設定(名前テンプレート、プロジェクト名)見直し。

・実際にどんな name を投げているかログ出力して確認。

といった切り分けが役に立つ。

安全な命名パターンとテンプレート化

毎回名前を手書きするのではなく、構造を決めてテンプレート化するとトラブルが減る。例えば、次のようなルール。

・[プロジェクト]-[役割]-[環境]-[番号]

・文字は小文字・数字・ハイフンのみ。

# 例: 手作業やスクリプトでの命名テンプレート
PROJECT="myapp"
ROLE="api"
ENV="dev"
ID="01"

NAME="${PROJECT}-${ROLE}-${ENV}-${ID}"   # myapp-api-dev-01
docker run --name "$NAME" myorg/app:1.0

docker-compose.yml も、サービス名とプロジェクト名をこのルールに合わせれば、生成されるコンテナ名も自然になる。

NG→OK 早見(よくあるエラー例と修正例)

# 1) スペース入り
# NG
docker run --name "web api" nginx
# OK
docker run --name web-api nginx

# 2) 日本語・特殊記号入り
# NG
docker run --name "開発環境#1" nginx
# OK
docker run --name dev-env-1 nginx

# 3) 名前の重複
# NG
docker run -d --name api nginx
docker run -d --name api nginx
# OK: 既存を消す or 名前を変える
docker rm -f api
docker run -d --name api nginx
# or
docker run -d --name api2 nginx

# 4) compose のサービス名にスペース
# NG
services:
  Web Api:
    image: myorg/app
# OK
services:
  web_api:
    image: myorg/app

# 5) 変数に改行が混ざっている
# NG
NAME="$(cat name.txt)"      # "my-app\n"
docker run --name "$NAME" nginx
# OK
NAME="$(tr -d '\n\r' < name.txt)"
docker run --name "$NAME" nginx

チェックリスト(上から順に確認)

1) エラーメッセージに表示されているコンテナ名そのものを確認したか(スペース・日本語・記号が入っていないか)
2) 小文字・数字・ハイフン(-)・アンダースコア(_).以外の文字が混ざっていないか
3) 先頭に / や記号が付いていないか
4) その名前のコンテナが既に存在していないか(docker ps -aで確認したか)
5) 環境変数やファイルから読み込んだ名前に改行や空文字が紛れていないか
6) docker-compose を使う場合、サービス名・container_name・プロジェクト名にスペースや禁止文字を使っていないか
7) 自作ツールやSDKで名前を組み立てる場合、実際にどんな文字列が渡っているかログで確認したか
8) 命名ルールをチームで決め、小文字+ハイフン中心の安全なパターンに統一したか