私のプロジェクトの1つでこのDockerエラーに遭遇しました:
invalid reference format: repository name must be lowercase
この一般的なメッセージのさまざまな原因は何ですか?
私はいくつかの努力の後でそれをすでに理解しました、それで私はそれをここに文書化するために私自身の質問に答えるつもりです。 Dockerが遭遇する直接の問題。
私のプロジェクトの1つでこのDockerエラーに遭遇しました:
invalid reference format: repository name must be lowercase
この一般的なメッセージのさまざまな原因は何ですか?
私はいくつかの努力の後でそれをすでに理解しました、それで私はそれをここに文書化するために私自身の質問に答えるつもりです。 Dockerが遭遇する直接の問題。
回答:
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
Dockerは混合文字も許可しないことを強調しておきます。
良い:
docker build -t myfirstechoimage:0.1 .
悪い:
docker build -t myFirstEchoImage:0.1 .
私の場合は -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
空白が欠落していないかどうかも確認してください
-e
に、環境変数の前の1つが欠落していました。
現在の作業ディレクトリにスペースがあり、$(pwd)
ボリュームをマップするために使用します。ディレクトリ名のスペースは好きではありません。
$(pwd)
は引用符で囲み、それはうまくいきました。
私の場合、で定義された画像名にdocker-compose.yml
は大文字が含まれていました。repository
代わりに言及されたエラーメッセージimage
が問題を説明するのに役立たず、理解するのに時間がかかったという事実。
FROM bla:bla AS BUILD
失敗しました。FROM bla:bla AS build
OK Thxでした!
私の場合、問題はパラメータの配置にありました。最初は--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']}]"
MacOSでは、iCloudドライブで作業している場合、$ PWDには「モバイルドキュメント」ディレクトリが含まれます。スペースが気に入らないようです!
回避策として、プロジェクトフォルダへのパスにスペースがないローカルドライブにプロジェクトをコピーしました。
iCloudへのデフォルトパスを変更する方法がわかりません。 ~/Library/Mobile Documents/com~apple~CloudDocs
「MobileDocuments」のパスのスペースは、dockerrunが気に入らないもののようです。
Mobile\ Documents
交換image: ${DOCKER_REGISTRY}notificationsapi
しimage: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
だから私はそれが持っていた小文字以外の文字が原因だったと思います
私にとっての問題は、エスケープされなかったボリュームマッピングのスペースにありました。docker runコマンドを実行していたjenkinsジョブにスペースがあり、その結果、dockerengineはdockerrunコマンドを理解できませんでした。
実際、今日の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
特定の複数の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>
reference
Dockerの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を使用している場合は、イメージ名に大文字が含まれているかどうかを実行コマンドで確認してください。
このエラーのために特別に書かれたこのドキュメントを読んでください。
"docker build -f Dockerfile -tSpringBoot-Docker。" 上記の賞賛のように、Dockerコンテナのイメージファイルを作成しています。Commendは、create image use file(-fはdockerファイルを参照)と言っていますにプッシュするイメージファイルのターゲットに対して、)と-tを。「。」現在のディレクトリを表します
上記の問題の解決策:ターゲットイメージ名を小文字で指定します
Dockerは、Dockerfileから指示を読み取ることにより、イメージを自動的に構築できます。Dockerfileは、ユーザーがコマンドラインで呼び出してイメージをアセンブルできるすべてのコマンドを含むテキストドキュメントです。例:FROM python:3.7-alpine「python」は小文字にする必要があります
私の場合、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
上記の回答のほとんどは私の場合には機能しなかったので、誰かがそれが役立つと思った場合に備えてこれを文書化します。dockerfileの最初の行でFROM node:10
私の場合のためには、言葉のノードがあってはならない、大文字すなわちFROM NODE:10
。私はその変更を行い、それは機能しました。
私の場合、裸の--env
スイッチ、つまり実際の変数名または値のないスイッチがありました。例:
docker run \
--env \ <----- This was the offending item
--rm \
--volume "/home/shared:/shared" "$(docker build . -q)"