docker『Invalid Reference Format』の原因と対処法

docker『Invalid Reference Format』の原因と対処法

docker run / pull / build / compose などで指定したイメージ名やタグの書き方がDockerのルールに合っていないときに出るエラー。スペースやコロンの位置、レジストリ名・リポジトリ名・タグの混同、シェル変数の書き方ミス、docker-compose.yml の記述揺れなどで発生しやすい。まず「どのコマンドのどの引数が『イメージ名』として解釈されているのか」を特定し、正式な書式に直す。

エラーの意味と発生条件

「Invalid reference format」は「イメージの参照(reference)の書式が無効」という意味。具体的には次のような条件で発生する。

・docker run / pull / build / push / tag の引数に、Dockerの規則に合わないイメージ名/タグを渡した。

・docker-compose.yml の image: に不正な文字列を書いた。

・シェルのスペース・クォート・変数展開のせいで、意図と違う形の文字列がdockerに渡っている。

・レジストリ名やタグ部分に、許可されない文字やフォーマットを含めてしまった。

イメージ名・タグのルールを整理する

イメージ名は大きく以下の構造になっている。

[registryhost/][namespace/]repository[:tag][@digest]

# 例
nginx:1.25
docker.io/library/nginx:1.25
ghcr.io/myorg/myapp:2025-11-01




よくあるミスのポイントは次の通り。

・repository 部分は基本的に「小文字英数字+ . _ – 」のみ(大文字や空白はNG)。

・コロン : はタグ(:tag)の区切りに1回だけ使う(ポート番号を書くなら registryhost にだけ)。

・スペースが入ると、そこで引数が分割されて別の意味になる。

コマンドラインでの典型的なNGパターン

# NG: スペースでtagが別引数になっている
docker run myapp: latest

# NG: レジストリとポートとタグがぐちゃっと混ざっている
docker run myregistry:5000/myapp:1:2

# NG: 大文字や空白を含むリポジトリ名
docker build -t MyApp Image:latest 
# OK: tagを1つにまとめ、名前は小文字で
docker run myapp:latest
docker run myregistry:5000/myapp:1.2

# OK: build時も正しい書式で
docker build -t myorg/myapp:2025-11-01 .

docker run / pull / build の具体的な修正例

# NG: build の -t の直後にスペースを入れてしまう
docker build -t myorg/myapp :latest .

# NG: -t の引数をクォートせず、shell展開で壊す
TAG=2025-11-01 debug
docker build -t myorg/myapp:$TAG debug .

# OK: -t の引数を1つの文字列にする
docker build -t myorg/myapp:2025-11-01 .

# OK: shell変数の場合もコロンを含めて1つのトークンにする
TAG=2025-11-01
docker build -t myorg/myapp:${TAG} .
# NG: docker run で env 変数をそのままイメージ名として使って壊す
export IMAGE="myorg/myapp"      # tag なし
docker run $IMAGE:             # : の後ろが空でエラー

# OK: デフォルトtagを決めて組み立てる
export IMAGE="myorg/myapp"
export TAG="2025-11-01"
docker run ${IMAGE}:${TAG}

docker-compose.yml の image 記述ミスを直す

# NG例: imageの中で変な文字を混ぜてしまう
services:
  app:
    image: myorg/myapp: latest   # ← スペース入り


# OK例: 1つの文字列として正しく書く
services:
  app:
    image: myorg/myapp:latest

環境変数を使うときも、構造を崩さないように注意する。

# NG: コロンを環境変数に含め忘れて組み立てが壊れる
services:
  app:
    image: ${IMAGE_NAME}:${IMAGE_TAG:-latest}

# IMAGE_NAME="myorg/myapp:" などとなっていると二重コロンでエラー
# OK: repository と tag を分けて管理して組み立て
# .env
IMAGE_REPO=myorg/myapp
IMAGE_TAG=2025-11-01

# docker-compose.yml
services:
  app:
    image: "${IMAGE_REPO}:${IMAGE_TAG}"

変数展開とシェルのクォートの罠

shell経由でdockerを叩くとき、スペース・クォート・変数展開の扱いを誤ると意図しない形で文字列が渡される。

# NG: コマンド置換の結果にスペースが含まれている例
docker run $(cat image.txt)

# image.txt の中身: "myorg/myapp:2025-11-01 latest"
# → 2引数に割れて invalid reference format

# OK: ファイルから「イメージ名だけ」を取るか、1行1件にする
IMAGE=$(head -n1 image.txt | awk '{print $1}')
docker run "$IMAGE"
# NG: 空の環境変数で末尾コロンだけになる
TAG=
docker run myorg/myapp:$TAG    # → "myorg/myapp:" となりエラー

# OK: デフォルト値を使う
TAG=${TAG:-latest}
docker run myorg/myapp:${TAG}

レジストリ・ポート・タグのコロンを整理する

レジストリのポートとタグ、両方にコロンを使うため、書き方を間違えるとすぐに壊れる。

# 正しい構造
<registryhost>[:port]/<namespace>/<repo>[:tag]

# OK例
myregistry:5000/myorg/myapp:2025-11-01

# NG: コロンを2回以上使ってしまう
myregistry:5000:443/myorg/myapp:1.0       # レジストリホストが不正
myregistry:5000/myorg/myapp:1:0           # tagが不正

ポートはレジストリホストに対して1回だけ、タグは最後に1回だけ、という形を守る。

リポジトリ名に使える文字・使えない文字

イメージの repository 名には次のような制約がある。

・小文字の a-z と数字 0-9。

・区切りとして .(ドット)、_(アンダースコア)、-(ハイフン)が使える。

・大文字・スペース・日本語・特殊記号(@, !, ?, % など)はNG。

# NG
myOrg/MyApp        # 大文字
my org/myapp       # スペース
myorg/myapp#2025   # # を含む

# OK
myorg/myapp
myorg/myapp_v2
myorg/myapp-2025.11

タグ(tag)側にも制約はあるが、基本的には「空にしない」「スペースを入れない」「コロンを含めない」あたりを守れば大きく外さない。

CI/CD パイプラインでの対処(テンプレ化してミスを防ぐ)

# 例: GitHub Actions などのスクリプトでイメージ名を組み立てる
REPO="ghcr.io/myorg/myapp"
TAG="${GITHUB_SHA:-dev}"          # commit hash など
IMAGE="${REPO}:${TAG}"

echo "Building ${IMAGE}"
docker build -t "${IMAGE}" .
docker push "${IMAGE}"

イメージ名の組み立てロジックを1箇所に集約しておき、そこだけテストするようにすると、Invalid reference format の事故を減らしやすい。

デバッグ用ワンライナーとチェックの仕方

# 1) docker が「イメージ名として解釈する文字列」を echo で出して確認
IMAGE="myorg/myapp:2025-11-01"
echo "Using image: '${IMAGE}'"
docker run "${IMAGE}"            # ここでInvalid reference formatならIMAGE自体が不正

# 2) docker image inspect で形式を確認(存在確認も兼ねる)
docker image inspect "${IMAGE}" >/dev/null && echo "valid" || echo "invalid"

# 3) docker-compose.yml を展開して確認
docker compose config | sed -n '/image:/p'

NG→OK 例を並べてパターンを覚える

# NG: スペース入り
docker run myorg/myapp: latest
# OK
docker run myorg/myapp:latest

# NG: 末尾コロン
docker run myorg/myapp:
# OK: tagを入れる or 省略してlatest
docker run myorg/myapp:2025-11-01
docker run myorg/myapp

# NG: 大文字リポジトリ
docker build -t MyOrg/MyApp:1.0 .
# OK: 小文字に統一
docker build -t myorg/myapp:1.0 .

# NG: レジストリ+ポート+タグがぐちゃぐちゃ
docker run myregistry:5000/myapp:1:2
# OK
docker run myregistry:5000/myapp:1.2

チェックリスト(上から順に潰す)


1) 「イメージ名として渡している文字列」を echo して眺めたか
2) コロンの位置が「レジストリのポート」と「タグ」で2箇所に収まっているか
3) リポジトリ名に大文字・スペース・日本語・特殊記号が混ざっていないか
4) スペースや空のtagで「末尾コロン」になっていないか
5) docker-compose.yml の image: が1つの連続した文字列として解釈されているか
6) 変数展開でイメージ名が壊れていないか(echoで実際の値を確認したか)
7) docker compose config / docker image inspect で最終的なimage名を検証したか