docker『Invalid Reference Format』の原因と対処法
- 作成日 2025.11.19
- その他
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名を検証したか
-
前の記事
docker『Connection Refused』の原因と対処法 2025.11.18
-
次の記事
docker『Cannot Allocate Memory』の原因と対処法 2025.11.20
コメントを書く