Dockerエラー:無効な参照形式:リポジトリ名は小文字である必要があります


92

私のプロジェクトの1つでこのDockerエラーに遭遇しました:

invalid reference format: repository name must be lowercase

この一般的なメッセージのさまざまな原因は何ですか?

私はいくつかの努力の後でそれをすでに理解しました、それで私はそれをここに文書化するために私自身の質問に答えるつもりです。 Dockerが遭遇する直接の問題。


このエラーメッセージの「参照」は、BMitchが回答で説明したように、画像の識別子です。したがって、画像を指すために使用した値の形式は無効です。読むBMitchの完全な説明:stackoverflow.com/a/52818152/336694
HostedMetrics.com

回答:


88

dockerの「参照」は、画像へのポインターです。これは、イメージ名、イメージID、名前にレジストリサーバーを含める、sha256タグを使用してイメージを固定するなど、実行するイメージを指すために使用できるものであれば何でもかまいません。

invalid reference formatエラーメッセージ手段ドッキングウィンドウを使用すると、イメージに提供してきた文字列を変換することはできません。これは無効な名前であるか、以前の解析エラーによるものである可能性がありますdocker runイメージの実行方法である場合コマンドラインのあります。作成ファイルで、イメージ名の変数を展開すると、その変数が正しく展開されない場合があります。

ではdocker run、コマンドライン、これは多くの場合、スペースでパラメータを引用し、コマンドラインの順序を間違えないで結果です。コマンドラインの順序は次のとおりです。

docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_to_exec}

引数を実行に渡す際の最も一般的なエラーは、スペースを含むパス名を展開し、パスを引用符で囲んだり、スペースをエスケープしたりしないボリュームマッピングです。例えば

docker run -v $(pwd):/data image_ref

そして、修正は次のように簡単です。

docker run -v "$(pwd):/data" image_ref

3
「dockerrunコマンドラインでは、これは多くの場合、パラメーターをスペースで引用せず、コマンドラインの順序を間違える結果になります」これは本当に役に立ちました
user9798 9920年

2年後でも非常に役立つ投稿です!
geo

完璧に動作しました。ありがとう!
イゴール・パレスマカオ-

25

Dockerは混合文字も許可しないことを強調しておきます。

良い: docker build -t myfirstechoimage:0.1 .

悪い: docker build -t myFirstEchoImage:0.1 .


1
うわー、これは多くの労力を節約しました!
好奇心旺盛な

1
SpringBootプロジェクトで「spotify」Maven依存関係を使用してDockerイメージを構築していますが、ここ数時間から、問題を理解するのに苦労していました。プロジェクトの名前(大文字を含む)が問題であることが判明しました!
AbhishekAggarwal20年

18

私の場合は -e mysqldockerのパラメータ前

docker run --name mysql-standalone -e MYSQL_ROOT_PASSWORD=hello -e MYSQL_DATABASE=hello -e MYSQL_USER=hello -e MYSQL_PASSWORD=hello -d mysql:5.6

空白が欠落していないかどうかも確認してください


5
私と同じよう-eに、環境変数の前の1つが欠落していました。
EricBishard20年

私の場合、外部環境から変数をエクスポートするのを忘れていました。
Przemek

15

現在の作業ディレクトリにスペースがあり、$(pwd)ボリュームをマップするために使用します。ディレクトリ名のスペースは好きではありません。


2
それは私にとってそれを解決しました!私$(pwd)は引用符で囲み、それはうまくいきました。
MerseyViking

8

私の場合、で定義された画像名にdocker-compose.ymlは大文字が含まれていました。repository代わりに言及されたエラーメッセージimageが問題を説明するのに役立たず、理解するのに時間がかかったという事実。


1
Webを検索して見つかったもう1つの一般的な原因は、ボリュームをマウントするときにディレクトリ名にスペース文字が含まれていることです。
hostedMetrics.com 2018年

それは別の理由で私に起こりました。大文字で名前が付けられたDockerfile内のdockerマルチステージビルド。例: FROM bla:bla AS BUILD失敗しました。FROM bla:bla AS buildOK Thxでした!
アンダーソン

8

私の場合、問題はパラメータの配置にありました。最初は--name、環境パラメータの後にパラメータがあり、次にボリュームとattach_dbs パラメータ、そしてコマンドの最後に次のような画像がありました。

docker run -p 1433:1433 -e sa_password=myComplexPwd -e ACCEPT_EULA=Y --name sql1 -v c:/temp/:c:/temp/ attach_dbs="[{'dbName':'TestDb','dbFiles':['c:\\temp\\TestDb.mdf','c:\\temp\\TestDb_log.ldf']}]" -d microsoft/mssql-server-windows-express

以下のようにパラメータを再配置した後、すべてが正常に機能しました(基本的に--nameパラメータの後に画像名を入力します)。

docker run -d -p 1433:1433 -e sa_password=myComplexPwd -e ACCEPT_EULA=Y --name sql1 microsoft/mssql-server-windows-express -v C:/temp/:C:/temp/ attach_dbs="[{'dbName':'TestDb','dbFiles':['C:\\temp\\TestDb.mdf','C:\\temp\\TestDb_log.ldf']}]"

4

MacOSでは、iCloudドライブで作業している場合、$ PWDには「モバイルドキュメント」ディレクトリが含まれます。スペースが気に入らないようです!

回避策として、プロジェクトフォルダへのパスにスペースがないローカルドライブにプロジェクトをコピーしました。

iCloudへのデフォルトパスを変更する方法がわかりません。 ~/Library/Mobile Documents/com~apple~CloudDocs

「MobileDocuments」のパスのスペースは、dockerrunが気に入らないもののようです。


1
代わりにプロジェクトをコピーするには、スペースなどをエスケープすることができます Mobile\ Documents
efru

1

交換image: ${DOCKER_REGISTRY}notificationsapiimage:notificationsapi たり image: ${docker_registry}notificationsapi 解きにドッキングウィンドウ-compose.ymlに問題がなかったです

エラーのあるファイル

  version: '3.4'

services:
  notifications.api:
    image: ${DOCKER_REGISTRY}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

エラーのないファイル

version: '3.4'

services:
 notifications.api:
    image: ${docker_registry}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

だから私はそれが持っていた小文字以外の文字が原因だったと思います


1

私にとっての問題は、エスケープされなかったボリュームマッピングのスペースにありました。docker runコマンドを実行していたjenkinsジョブにスペースがあり、その結果、dockerengineはdockerrunコマンドを理解できませんでした。


1

実際、今日のdockerレジストリ(sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305)は、大文字を含むパスを処理しません。これは明らかに不適切な設計上の選択です。おそらく、ファイルレベルで大文字と小文字を区別しない特定のオペレーティングシステム(つまり、Windows)との互換性を維持したいためです。

スコープを認証し、存在しないリポジトリをすべて小文字でフェッチしようとすると、出力は次のようになります。

(auth step not shown)
curl -s -H "Authorization: Bearer $TOKEN" -X GET https://$LOCALREGISTRY/v2/test/someproject/tags/list
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"test/someproject","Action":"pull"}]}]}

ただし、大文字のコンポーネントを使用してこれを実行しようとすると、404のみが返されます。

(authorization step done but not shown here)
$ curl -s -H "Authorization: Bearer $TOKEN" -X GET https://docker.uibk.ac.at:443/v2/test/Someproject/tags/list

404 page not found

1

特定の複数のenv変数がインラインであるときに-eフラグを見逃すことがあります

例:悪い: docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>

良い: docker run --name somecontainername -e ENV_VAR1=somevalue1 -e ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>


1

referenceDockerのAは、イメージを指すものです。これは、リモートレジストリまたはローカルレジストリにある可能性があります。最初にエラーメッセージを説明してから、その解決策を示します。

無効な参照形式

これは、使用した参照が有効な形式ではないことを意味します。これは、画像を識別するために使用した参照(ポインタ)が無効であることを意味します。通常、この後に次のような説明が続きます。これにより、エラーがより明確になります。

無効な参照形式:リポジトリ名は小文字である必要があります

これは、使用している参照に大文字を使用しないことを意味します。docker run Ubuntu間違った)vs docker run ubuntu正しい)を実行してみてください。Dockerでは、画像参照として大文字を使用できません。簡単なトラブルシューティング手順。

1)Dockerfileには、画像として大文字が含まれています。

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2)docker-compose.ymlで定義された画像名に大文字が含まれていました

3)DockerコンテナのデプロイにJenkinsまたはGoCDを使用している場合は、イメージ名に大文字が含まれているかどうかを実行コマンドで確認してください。

このエラーのために特別に書かれたこのドキュメントを読んでください。


0

同じエラーが発生しましたが、何らかの理由で、docker runコマンドを実行したJenkinsジョブの大文字が原因であると思われます。


0

これは$(pwd)、マップボリューム用の現在の作業ディレクトリのスペースが原因で発生しています。だから、私は使用しましたdocker-compose代わりました。

docker-compose.ymlファイル。

version: '3'
services:
  react-app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - /app/node_modules
      - .:/app

0

"docker build -f Dockerfile -tSpringBoot-Docker。" 上記の賞賛のように、Dockerコンテナのイメージファイルを作成しています。Commendは、create image use file(-fはdockerファイルを参照)と言っていますにプッシュするイメージファイルのターゲットに対して、)と-tを。「。」現在のディレクトリを表します

上記の問題の解決策:ターゲットイメージ名を小文字で指定します


0

Dockerは、Dockerfileから指示を読み取ることにより、イメージを自動的に構築できます。Dockerfileは、ユーザーがコマンドラインで呼び出してイメージをアセンブルできるすべてのコマンドを含むテキストドキュメントです。例:FROM python:3.7-alpine「python」は小文字にする必要があります


0

私の場合、dockerを介してpostgresを実行しようとしていました。当初、私は次のように実行していました:

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=test_password POSTGRES_USER=test_user POSTGRES_DB=test_db --rm -v ~/docker/volumes/postgres:/var/lib/postgresql/data --name pg-docker postgres

各環境変数の後に-eがありませんでした。上記のコマンドを以下のコマンドに変更すると、うまくいきました

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=test_password -e POSTGRES_USER=test_user -e POSTGRES_DB=test_db --rm -v ~/docker/volumes/postgres:/var/lib/postgresql/data --name pg-docker postgres


0

エラーメッセージが問題の文字列を出力することを望みます。「dockerrun」コマンドの奇妙なコピーアンドペーストの問題が原因でこれが発生していました。リポジトリと画像名の前にスペースのような文字が使用されていました。


0

上記の回答のほとんどは私の場合には機能しなかったので、誰かがそれが役立つと思った場合に備えてこれを文書化します。dockerfileの最初の行でFROM node:10私の場合のためには、言葉のノードがあってはならない、大文字すなわちFROM NODE:10。私はその変更を行い、それは機能しました。


0

私の場合、DockerFileには小文字ではなく大文字と小文字が混在するイメージ名が含まれていました。

DockerFileの前の行

FROM CentOs

上記をに変更するとFROM centos、スムーズに動作しました。


0

私の場合、裸の--envスイッチ、つまり実際の変数名または値のないスイッチがありました。例:

docker run \
   --env \       <----- This was the offending item
   --rm \
   --volume "/home/shared:/shared" "$(docker build . -q)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.