Docker-Fehler: Ungültiges Referenzformat: Repository-Name muss klein geschrieben sein

86

Ist bei einem meiner Projekte auf diesen Docker-Fehler gestoßen:

invalid reference format: repository name must be lowercase

Was sind die verschiedenen Ursachen für diese generische Nachricht?

Ich habe es bereits nach einiger Anstrengung herausgefunden, daher werde ich meine eigene Frage beantworten, um es hier zu dokumentieren, da die Lösung bei einer Websuche nicht sofort angezeigt wird und auch, weil diese Fehlermeldung nicht beschreibt das direkte Problem, auf das Docker stößt.

HostedMetrics.com
quelle
"Referenz" in dieser Fehlermeldung ist die Kennung eines Bildes, wie BMitch in seiner Antwort erklärt hat. Das Format des Werts, mit dem Sie auf ein Bild zeigen, ist daher ungültig. Lesen Sie die vollständige Erklärung von BMitch
HostedMetrics.com

Antworten:

79

Eine "Referenz" im Docker ist ein Zeiger auf ein Bild. Es kann sich um einen Bildnamen, eine Bild-ID, einen Registrierungsserver im Namen, ein sha256-Tag zum Anheften des Bildes und alles andere handeln, das verwendet werden kann, um auf das Bild zu verweisen, das Sie ausführen möchten.

Die invalid reference formatFehlermeldung bedeutet, dass Docker die von Ihnen angegebene Zeichenfolge nicht in ein Bild konvertieren kann. Dies kann ein ungültiger Name sein oder auf einen Analysefehler früher in der docker runBefehlszeile zurückzuführen sein, wenn Sie das Image 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 runBefehlszeile führt dies häufig dazu, dass Parameter nicht 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 beim Übergeben von Argumenten an den Lauf ist eine Datenträgerzuordnung, die einen Pfadnamen erweitert, der ein Leerzeichen enthält, und den Pfad nicht zitiert oder dem Leerzeichen entgeht. Z.B

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

Und die Lösung ist so einfach wie:

docker run -v "$(pwd):/data" image_ref
BMitch
quelle
3
"Bei der Docker-Befehlszeile führt dies häufig dazu, dass Parameter nicht mit Leerzeichen angegeben werden und die Reihenfolge der Befehlszeile falsch ist." Dies war sehr hilfreich
user979899
Sehr hilfreicher Beitrag auch 2 Jahre später!
Geo
Hat perfekt funktioniert. Vielen Dank!
Igor Melão
24

Lassen Sie mich betonen, dass Docker nicht einmal gemischte Zeichen zulässt.

Gut: docker build -t myfirstechoimage:0.1 .

Schlecht: docker build -t myFirstEchoImage:0.1 .

Z3d4s
quelle
1
Wow, das hat viel Mühe gespart!
neugierig
1
Ich verwende die Maven-Abhängigkeit "spotify" im SpringBoot-Projekt, um das Docker-Image zu erstellen, und in den letzten Stunden hatte ich Probleme, das Problem zu verstehen. Der Name des Projekts (enthält Großbuchstaben) stellt sich als Problem heraus!
Abhishek Aggarwal
15

hatte ein Leerzeichen im aktuellen Arbeitsverzeichnis und usign $(pwd), um Volumes zuzuordnen. Mag keine Leerzeichen in Verzeichnisnamen.

Colin Claverie
quelle
2
Das hat es für mich gelöst! Ich wickelte $(pwd)in Anführungszeichen und es funktionierte.
MerseyViking
14

In meinem Fall war das -evor den Parametern für MySQL Docker

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

Überprüfen Sie auch, ob Leerzeichen fehlen

Jöcker
quelle
5
Ebenso fehlte mir die -evor einer meiner Umgebungsvariablen.
Eric Bishard
In meinem Fall habe ich vergessen, Variablen aus einer externen Umgebung zu exportieren.
Przemek
8

In meinem Fall docker-compose.ymlenthielt der in Großbuchstaben definierte Bildname Großbuchstaben. Die Tatsache, dass die Fehlermeldung repositoryanstelle von erwähnt wurde, imagehalf nicht, das Problem zu beschreiben, und es dauerte eine Weile, bis es herausgefunden wurde.

HostedMetrics.com
quelle
1
Eine weitere häufige Ursache beim Durchsuchen des Webs war, dass die Benutzer beim Mounten von Volumes Leerzeichen in ihren Verzeichnisnamen haben.
HostedMetrics.com
Es ist mir aus einem anderen Grund passiert. Der Docker ist mehrstufig in einer Docker-Datei aufgebaut, die mit Großbuchstaben benannt ist. Beispiel: FROM bla:bla AS BUILDfehlgeschlagen. FROM bla:bla AS buildwar OK Thx!
Anderson Marques
8

In meinem Fall lag das Problem in der Parameteranordnung. Anfangs hatte ich --nameParameter nach Umgebungsparametern und dann Volumen und attach_dbs Parameter und 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

Nach dem Umordnen der Parameter wie unten hat alles einwandfrei funktioniert (im Grunde genommen wird der --nameParameter gefolgt vom Bildnamen eingegeben).

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']}]"
josip.k
quelle
4

Unter MacOS enthält Ihr $ PWD ein Verzeichnis "Mobile Documents", wenn Sie an einem iCloud-Laufwerk arbeiten. Es scheint den Raum nicht zu mögen!

Um dieses Problem zu umgehen, habe ich mein Projekt auf ein lokales Laufwerk kopiert, auf dem im Pfad zu meinem Projektordner kein Speicherplatz vorhanden ist.

Ich sehe keine Möglichkeit, den Standardpfad zu iCloud zu ändern ~/Library/Mobile Documents/com~apple~CloudDocs

Der Platz im Pfad in "Mobile Documents" scheint das zu sein, was Docker Run nicht mag.

user279838
quelle
1
Anstatt das Projekt zu kopieren, können Sie den Raum verlassen, zB Mobile\ Documents
efru
1

Das Ersetzen image: ${DOCKER_REGISTRY}notificationsapi durch image:notificationsapi oder image: ${docker_registry}notificationsapi in docker-compose.yml hat das Problem behoben

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, der Fehler war auf Kleinbuchstaben zurückzuführen

nandithakw
quelle
1

Für mich war das Problem mit dem Speicherplatz in der Datenträgerzuordnung, der nicht maskiert wurde. Der Jenkins-Job, der den Docker-Ausführungsbefehl ausführte, hatte ein Leerzeichen und daher konnte die Docker-Engine den Docker-Ausführungsbefehl nicht verstehen.

Vipul Malgotra
quelle
1

Tatsächlich verarbeitet die Docker-Registrierung ab heute (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) keine Pfade, die Großbuchstaben enthalten. Dies ist offensichtlich eine schlechte Wahl für das Design, wahrscheinlich weil Sie mit bestimmten Betriebssystemen kompatibel bleiben möchten, bei denen die Groß- und Kleinschreibung auf Dateiebene (z. B. Windows ) nicht unterschieden wird .

Wenn man sich für einen Bereich authentifiziert und versucht, ein nicht vorhandenes Repository mit Kleinbuchstaben abzurufen, lautet die Ausgabe

(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 man dies jedoch mit einer Großbuchstabenkomponente versucht, 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
Otheus
quelle
1

Manchmal vermisst du das Flag -e, während bestimmte mehrere Umgebungsvariablen inline sind

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

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

Gaurav Arora
quelle
1

Ein referencein Docker zeigt auf ein Bild. Dies kann sich in einer Remote-Registrierung oder in der lokalen Registrierung befinden. Lassen Sie mich zuerst die Fehlermeldung beschreiben und dann die Lösungen dafür zeigen.

ungültiges Referenzformat

Dies bedeutet, dass die von uns verwendete Referenz kein gültiges Format ist. Dies bedeutet, dass die Referenz (Zeiger), mit der wir ein Bild identifiziert haben, ungültig ist. Im Allgemeinen folgt darauf eine Beschreibung wie folgt. Dadurch wird der Fehler viel deutlicher.

Ungültiges Referenzformat: Der Repository-Name muss in Kleinbuchstaben angegeben werden

Dies bedeutet, dass die von uns verwendete Referenz keine Großbuchstaben enthalten sollte. Versuchen Sie, docker run Ubuntu( falsch ) gegen docker run ubuntu( richtig ) zu laufen . Docker erlaubt keine Großbuchstaben als Bildreferenz. Einfache Schritte zur Fehlerbehebung.

1) Dockerfile enthält Großbuchstaben als Bilder.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Der in der Datei docker-compose.yml definierte Bildname hatte Großbuchstaben

3) Wenn Sie Jenkins oder GoCD zum Bereitstellen Ihres Docker-Containers verwenden, überprüfen Sie den Befehl run, ob der Image-Name einen Großbuchstaben enthält.

Bitte lesen Sie dieses Dokument, das speziell für diesen Fehler geschrieben wurde.

Keet Sugathadasa
quelle
0

Ich hatte den gleichen Fehler, und aus irgendeinem Grund scheint er durch Großbuchstaben im Jenkins-Job verursacht worden zu sein, der den docker runBefehl ausgeführt hat.

kenneho
quelle
0

Dies geschieht aufgrund der Leerzeichen im aktuellen Arbeitsverzeichnis, aus denen $(pwd)für Kartenvolumes stammen. Also habe ich benutztdocker-compose stattdessen verwendet.

Die docker-compose.ymlDatei.

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

"Docker-Build -f Docker-Datei -t SpringBoot-Docker." Wie in der obigen Empfehlung erstellen wir eine Bilddatei für den Docker-Container. Commend sagt, dass Sie eine Image-Use-Datei erstellen ( -f beziehen sich auf die Docker-Datei ) und -t für das Ziel der Image-Datei, die wir an Docker senden möchten. das "." repräsentiert das aktuelle Verzeichnis

Lösung für das obige Problem: Geben Sie den Namen des Zielbilds in Kleinbuchstaben an

Karthik Wodeyar
quelle
0

Docker kann Bilder automatisch erstellen, indem es die Anweisungen aus einer Docker-Datei liest. Eine Docker-Datei ist ein Textdokument, das alle Befehle enthält, die ein Benutzer in der Befehlszeile aufrufen kann, um ein Bild zusammenzustellen. Beispiel: FROM Python: 3.7-alpine Die 'Python' sollte in Kleinbuchstaben geschrieben werden

HizikNewton
quelle
0

In meinem Fall habe ich versucht, Postgres durch Docker zu führen. Anfangs lief ich als:

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

Ich habe -e nach jeder Umgebungsvariablen vermisst . Das Ändern des obigen Befehls in den folgenden hat funktioniert

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

Mohammed Siddiq
quelle
0

Ich wünschte, die Fehlermeldung würde die Problemzeichenfolge ausgeben. Ich bekam dies aufgrund eines seltsamen Problems beim Kopieren und Einfügen eines "Docker Run" -Befehls. Ein platz- wie Charakter wurde vor den Repo- und Bildnamen verwendet wird.

Jamshid
quelle
0

Die meisten der oben genannten Antworten haben in meinem Fall nicht funktioniert, daher werde ich dies dokumentieren, falls jemand es hilfreich findet. Die erste Zeile in der Docker-Datei FROM node:10für meinen Fall, das Wort Knoten sollte nicht in Großbuchstaben sein, dh FROM NODE:10. Ich habe diese Änderung vorgenommen und es hat funktioniert.

Shadrack Mwangi
quelle
0

In meinem Fall enthielt DockerFile den Bildnamen in gemischter Groß- und Kleinschreibung anstelle von Kleinbuchstaben.

Frühere Zeile in meiner DockerFile

FROM CentOs

und als ich oben zu FROM centoswechselte, funktionierte es reibungslos.

Sambhav Pandey
quelle
0

In meinem Fall hatte ich einen nackten --envSchalter, dh einen ohne tatsächlichen Variablennamen oder -wert, z.

docker run \
   --env \       <----- This was the offending item
   --rm \
   --volume "/home/shared:/shared" "$(docker build . -q)"
MikeSchinkel
quelle
-2

Versuchen Sie, in Ihrem DockerFile Kleinbuchstaben zu verwenden

Verwenden Sie zum Beispiel:

openjdk:8

anstatt

openJDK:8
Jon
quelle