Dockerの「invalid reference format」エラーを解決する方法

beginner🐳 Docker2026-07-16| Docker Engine (全バージョン), Linux, macOS, Windows (PowerShell/CMD/WSL2)

Error Message

invalid reference format
#docker#devops#トラブルシューティング#docker-image#構文

エラーの発生状況Dockerコマンドを入力して実行し、プログレスバーが表示されるのを待っていると、代わりに「invalid reference format」というそっけない1行の拒否メッセージが表示されることがあります。これは通常、docker pullrun、またはbuildの実行中に発生します。

docker pull My-Awesome-Image:latest
# 出力: invalid reference format

Dockerは命名規則(文法)に対して非常に厳格です。スペースの入力ミス、不注意による大文字の使用、シェル変数内の余計な文字など、わずかなミスでもこのエラーがトリガーされます。これは、提供されたイメージのアドレスをDockerが解析(パース)できないことを意味しています。

エラーの原因標準的なDockerのリファレンスは、[REGISTRY/][NAMESPACE/]REPOSITORY[:TAG|@DIGEST]という厳格な構造に従っています。このパターンから外れると、コマンドは失敗します。多くの開発者がこのエラーに遭遇する主な理由は以下の通りです:

  • 大文字の使用: タグには技術的に使用可能ですが、リポジトリ名は厳密に小文字である必要があります。- 末尾のスラッシュ: イメージ名の最後に / を付けると、Dockerは名前を空のままにしていると判断します。- 不正な記号: イメージ名に $%& などの文字を使用している。- 空の変数: 値が空またはnullのシェル変数を参照した結果、コロンやスラッシュだけが残ってしまう。- ポート指定の混同: localhost:5000 のようなプライベートレジストリに接続する際、コロンの位置を間違えている。## クイック解決策### 1. すべて小文字にするこれが最も一般的な原因です。Dockerのリポジトリ名に大文字は使用できません。プロジェクト名が Web-App の場合、Dockerはそれを拒否します。
# 誤り
docker build -t MyProject:v1.0 .

# 正解
docker build -t myproject:v1.0 .

2. 空のシェル変数を処理するGitHub ActionsやGitLab CIなどのCI/CDパイプラインでは、バージョニングに変数を使用することがよくあります。もし $APP_VERSION が設定されていない場合、docker pull my-app:$APP_VERSION コマンドは docker pull my-app: となり、無効な形式になります。これを防ぐために、常にデフォルト値を設定してください。

# $TAG が空の場合、失敗します
docker pull my-service:$TAG

# 修正策:デフォルト値(例:'latest')を使用する
docker pull my-service:${TAG:-latest}

3. レジストリURLをクリーンアップするブラウザやクラウドコンソール(AWS ECRやAzure ACRなど)からURLをコピーすると、誤って末尾にスラッシュを含めてしまうことがあります。Dockerは、文字列がディレクトリパスではなくイメージ名で終わることを期待しています。

# 誤り(末尾のスラッシュに注意)
docker pull my-registry.azurecr.io/my-app/

# 正解
docker pull my-registry.azurecr.io/my-app

4. プライベートレジストリのポートを修正するポート5000でローカルレジストリを使用する場合、ホスト:ポートとイメージ名を区切るにはスラッシュを使用する必要があります。リポジトリ名にコロンを連続して使用することはできません。

# 誤り
docker pull localhost:5000:my-image:v1

# 正解
docker pull localhost:5000/my-image:v1

命名に関するベストプラクティス### 標準的な文字セットを守るワークフローの安定性を保つために、イメージ名に使用する文字を特定のセットに制限しましょう。小文字 (a-z)、数字 (0-9)、および基本的な区切り文字であるピリオド (.)、アンダースコア (_)、ハイフン (-) のみを使用してください。

名前の先頭や末尾に区切り文字を使用しないでください。例えば、-my-imagemy-image_ はどちらも無効であり、スクリプトが停止する原因になります。

変数を引用符で囲むシェルの挙動は予測できないことがあります。変数にスペースや隠し文字が含まれている場合、Dockerコマンドが断片化される可能性があります。スクリプト内では、イメージのリファレンスを常にダブルクォーテーションで囲むようにしましょう。

# スクリプトをより安全に記述する方法
FULL_IMAGE_NAME="${REGISTRY_URL}/${PROJECT_ID}/api-server:1.2.3"
docker pull "$FULL_IMAGE_NAME"

Docker Composeファイルを確認するdocker-compose.yml では、image: の行に誤って先頭にスペースが入っていないか確認してください。YAMLはインデントに敏感です。イメージ名の後の隠れたタブ文字や末尾のスペース一つで、パーサーがリファレンスエラーを起こすことがあります。

修正を確認する方法フォーマットを修正したと思ったら、その名前に対して docker inspect を実行してみてください。フォーマットが正しければ、Dockerはそのイメージを探そうとします。「No such object」と表示されるかもしれませんが、それは実は良い兆候です。イメージがまだローカルになくても、フォーマット自体は有効であることを意味するからです。

docker inspect my-corrected-image:v1

それでもエラーが表示される場合は、隠し文字を探してください。リッチテキストエディタやSlackからコマンドをコピーした際によく発生します。非表示文字の影響を排除するために、クリーンなターミナルウィンドウでコマンドを手動で再入力してみてください。

Related Error Notes