Dieser Docker-Fehler ist bei einem meiner Projekte aufgetreten:
invalid reference format: repository name must be lowercase
Was sind die verschiedenen Ursachen für diese generische Nachricht?
Ich habe es schon nach einiger Anstrengung herausgefunden, also werde ich meine eigene Frage beantworten, um sie hier zu dokumentieren, da die Lösung bei einer Websuche nicht sofort erscheint und auch, weil diese Fehlermeldung nicht beschreibt das direkte Problem, dem Docker begegnet.
In meinem Fall lag das Problem in der Parameteranordnung. Anfangs hatte ich --name
-Parameter nach Umgebungsparametern und dann Volumen- und attach_dbs
-Parameter und ein Bild am Ende des Befehls wie unten.
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
Nachdem die Parameter wie unten neu angeordnet wurden, funktionierte alles gut (im Grunde genommen --name
-Parameter gefolgt vom Bildnamen).
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']}]"
hatte ein Leerzeichen im aktuellen Arbeitsverzeichnis und verwendet $(pwd)
zum Zuordnen von Volumes. Mag keine Leerzeichen in Verzeichnisnamen.
Eine "Referenz" im Andockfenster ist ein Zeiger auf ein Bild. Dies kann ein Image-Name, eine Image-ID sein, einen Registrierungsserver im Namen enthalten, ein Sha256-Tag verwenden, um das Image zu pinnen, und alles andere, was verwendet werden kann, um auf das Image zu zeigen, das Sie ausführen möchten.
Die invalid reference format
-Fehlermeldung bedeutet, dass das Andockfenster die von Ihnen bereitgestellte Zeichenfolge nicht in ein Bild konvertieren kann. Dies kann ein ungültiger Name sein oder von einem Analysefehler zu einem früheren Zeitpunkt in der docker run
-Befehlszeile stammen, wenn Sie das Bild auf diese Weise ausführen. Wenn Sie bei einer Erstellungsdatei eine Variable im Bildnamen erweitern, wird diese Variable möglicherweise nicht richtig erweitert.
Bei der docker run
-Befehlszeile führt dies häufig dazu, dass keine Parameter mit Leerzeichen angegeben werden und die Reihenfolge der Befehlszeile falsch ist. Die Befehlszeile ist wie folgt angeordnet:
docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_to_exec}
Der häufigste Fehler bei der Übergabe von Argumenten an den Lauf ist eine Datenträgerzuordnung, die einen Pfadnamen erweitert, der ein Leerzeichen enthält, ohne den Pfad anzugeben oder das Leerzeichen zu umgehen. Z.B.
docker run -v $(pwd):/data image_ref
Und der Fix ist so einfach wie:
docker run -v "$(pwd):/data" image_ref
In meinem Fall enthielt der in docker-compose.yml
definierte Bildname Großbuchstaben. Die Tatsache, dass die Fehlermeldung repository
anstelle von image
erwähnte, half nicht, das Problem zu beschreiben, und es dauerte eine Weile, bis sie herausgefunden hatte.
Wenn Sie unter MacOS auf einem iCloud-Laufwerk arbeiten, enthält Ihre $ PWD ein Verzeichnis "Mobile Documents". Es scheint den Raum nicht zu mögen!
Um dieses Problem zu umgehen, habe ich mein Projekt auf ein lokales Laufwerk kopiert, wo im Pfad zu meinem Projektordner kein Platz ist.
Ich sehe keinen Weg, wie Sie den Standardpfad zu iCloud ändern können, nämlich ~/Library/Mobile Documents/com~Apple~CloudDocs
.
Das Leerzeichen im Pfad in "Mobile Documents" scheint dem Andocklauf nicht zu entsprechen.
Lassen Sie mich betonen, dass Docker nicht einmal gemischte Zeichen erlaubt.
Gut: docker build -t myfirstechoimage:0.1 .
Schlecht: docker build -t myFirstEchoImage:0.1 .
Ich hatte den gleichen Fehler und scheint aus irgendeinem Grund in Großbuchstaben in dem Jenkins-Job gewesen zu sein, der den Befehl docker run
ausgeführt hat.
Das Ersetzen von image: ${DOCKER_REGISTRY}notificationsapi
Durch image:notificationsapi
Oder image: ${docker_registry}notificationsapi
in in docker-compose.yml hat das Problem gelöst
datei mit Fehler
version: '3.4'
services:
notifications.api:
image: ${DOCKER_REGISTRY}notificationsapi
build:
context: .
dockerfile: ../Notifications.Api/Dockerfile
datei ohne Fehler
version: '3.4'
services:
notifications.api:
image: ${docker_registry}notificationsapi
build:
context: .
dockerfile: ../Notifications.Api/Dockerfile
Ich denke also, der Fehler war auf nicht Kleinbuchstaben zurückzuführen
Für mich war das Problem mit dem Speicherplatz im Volume-Mapping, dem nicht entgangen wurde. Der Jenkins-Job, auf dem der Docker-Run-Befehl ausgeführt wurde, hatte ein Leerzeichen, sodass die Docker-Engine den Docker-Run-Befehl nicht verstehen konnte.
Dies geschieht aufgrund der Leerzeichen im aktuellen Arbeitsverzeichnis, die von $(pwd)
für Kartendatenträger stammen. Also habe ich stattdessen docker-compose
verwendet.
Die docker-compose.yml
-Datei.
version: '3'
services:
react-app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- /app/node_modules
- .:/app
Tatsächlich verarbeitet die Docker-Registrierung (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
) heute keine Pfade, die Großbuchstaben enthalten. Dies ist offensichtlich eine schlechte Entwurfsentscheidung, wahrscheinlich aufgrund des Wunsches, mit bestimmten Betriebssystemen kompatibel zu sein, die auf Dateiebene keine Unterscheidung treffen (z. B. windows ).
Wenn Sie sich für einen Bereich authentifizieren und versuchen, ein nicht vorhandenes Repository mit Kleinbuchstaben abzurufen, wird die Ausgabe ausgegeben
(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"}]}]}
Wenn Sie dies jedoch mit einer Komponente in Großbuchstaben versuchen, wird nur 404 zurückgegeben:
(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