Errore Docker: formato di riferimento non valido: il nome del repository deve essere minuscolo


86

Mi sono imbattuto in questo errore Docker con uno dei miei progetti:

invalid reference format: repository name must be lowercase

Quali sono le varie cause di questo messaggio generico?

L'ho già capito dopo un po 'di sforzo, quindi risponderò alla mia domanda per documentarla qui poiché la soluzione non viene fuori subito quando si esegue una ricerca sul web e anche perché questo messaggio di errore non descrive il problema diretto che Docker incontra.


"riferimento" in questo messaggio di errore è l'identificatore di un'immagine, come ha spiegato BMitch nella sua risposta. Quindi il formato del valore che hai usato per puntare a un'immagine non è valido. Spiegazione completa Leggi BMitch di: stackoverflow.com/a/52818152/336694
HostedMetrics.com

Risposte:


78

Un "riferimento" in finestra mobile è un puntatore a un'immagine. Può essere un nome di immagine, un ID immagine, includere un server di registro nel nome, utilizzare un tag sha256 per bloccare l'immagine e qualsiasi altra cosa che possa essere utilizzata per puntare all'immagine che si desidera eseguire.

Il invalid reference formatmessaggio di errore indica che Docker non può convertire la stringa che hai fornito in un'immagine. Questo potrebbe essere un nome non valido o potrebbe essere dovuto a un errore di analisi precedente nella docker runriga di comando se è così che esegui l'immagine. Con un file di composizione, se espandi una variabile nel nome dell'immagine, quella variabile potrebbe non espandersi correttamente.

Con la docker runriga di comando, questo è spesso il risultato di non citare i parametri con spazi e di confondere l'ordine della riga di comando. La riga di comando è ordinata come:

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

L'errore più comune nel passare gli argomenti all'esecuzione è una mappatura del volume che espande un nome di percorso che include uno spazio e non cita il percorso o evita lo spazio. Per esempio

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

E la soluzione è facile come:

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

3
"Con la riga di comando di esecuzione docker, questo è spesso il risultato di non citare i parametri con spazi e di confondere l'ordine della riga di comando" Questo è stato davvero utile
user979899

Post estremamente utile anche 2 anni dopo!
Geo

Ha funzionato perfettamente. Grazie!
Igor Melão,

24

Permettetemi di sottolineare che Docker non consente nemmeno i caratteri misti.

Buono: docker build -t myfirstechoimage:0.1 .

Cattivo: docker build -t myFirstEchoImage:0.1 .


1
Wow, questo ha risparmiato un sacco di fatica!
curioso l'

1
Sto usando la dipendenza "spotify" Maven nel progetto SpringBoot per costruire l'immagine docker e nelle ultime due ore stavo lottando per capire il problema. Il nome del progetto (contiene caratteri maiuscoli) risulta essere il problema!
Abhishek Aggarwal

15

aveva uno spazio nella directory di lavoro corrente e usign $(pwd)per mappare i volumi. Non ama gli spazi nei nomi delle directory.


2
Questo ha risolto per me! Ho racchiuso $(pwd)tra virgolette e ha funzionato.
MerseyViking

14

Nel mio caso era la -eprima i parametri per 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

Controlla anche se mancano spazi bianchi


5
Lo stesso con me, mi mancava la -eprima delle mie variabili d'ambiente.
Eric Bishard,

nel mio caso ho dimenticato di esportare la variabile dall'ambiente esterno.
Przemek

8

Nel mio caso, il nome dell'immagine definito in docker-compose.ymllettere maiuscole contenute. Il fatto che il messaggio di errore menzionato al repositoryposto di imagenon ha aiutato a descrivere il problema e ci è voluto un po 'per capirlo.


1
Un'altra causa comune riscontrata durante la ricerca sul Web era che le persone hanno caratteri di spazio nei nomi di directory quando montano i volumi.
HostedMetrics.com

A me è successo per un motivo diverso. La costruzione multi-fase docker all'interno di un Dockerfile come denominato con lettere maiuscole. Esempio: FROM bla:bla AS BUILDfallito. FROM bla:bla AS buildera OK Thx!
Anderson Marques

8

Nel mio caso il problema era nella disposizione dei parametri. Inizialmente avevo --nameparametri dopo parametri di ambiente e quindi volume e attach_dbs parametri e un'immagine alla fine del comando come di seguito.

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

Dopo aver riorganizzato i parametri come sotto, tutto ha funzionato bene (fondamentalmente mettendo il --nameparametro seguito dal nome dell'immagine).

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

Su MacOS, quando lavori su un disco iCloud, il tuo $ PWD conterrà una directory "Documenti mobili". Non sembra gradire lo spazio!

Come soluzione alternativa, ho copiato il mio progetto sull'unità locale dove non c'è spazio nel percorso della cartella del mio progetto.

Non vedo un modo per aggirare il cambiamento del percorso predefinito di iCloud che è ~/Library/Mobile Documents/com~apple~CloudDocs

Lo spazio nel percorso in "Mobile Documents" sembra essere ciò che docker run non piace.


1
Invece di copiare il progetto, puoi sfuggire allo spazio, ad esempio Mobile\ Documents
efru

1

La sostituzione image: ${DOCKER_REGISTRY}notificationsapi con image:notificationsapi o image: ${docker_registry}notificationsapi in docker-compose.yml ha risolto il problema

file con errore

  version: '3.4'

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

file senza errori

version: '3.4'

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

Quindi penso che l'errore fosse dovuto a lettere non minuscole che aveva


1

Per me il problema riguardava lo spazio nella mappatura del volume che non era sfuggito. Il lavoro jenkins che eseguiva il comando docker run aveva uno spazio e di conseguenza il motore docker non era in grado di comprendere il comando docker run.


1

Infatti, il registro docker ad oggi (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) non gestisce percorsi contenenti caratteri maiuscoli. Questa è ovviamente una cattiva scelta di design, probabilmente dovuta al voler mantenere la compatibilità con alcuni sistemi operativi che non distinguono il case a livello di file (cioè, Windows ).

Se ci si autentica per uno scope e si cerca di recuperare un repository non esistente tutto minuscolo, l'output è

(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"}]}]}

Tuttavia, se si tenta di farlo con un componente maiuscolo, viene restituito solo 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

a volte ti manca -e flag mentre specifici più env vars inline

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

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


1

A referencein Docker è ciò che punta a un'immagine. Potrebbe essere in un registro remoto o nel registro locale. Consentitemi di descrivere prima il messaggio di errore e quindi di mostrare le soluzioni per questo.

formato di riferimento non valido

Ciò significa che il riferimento che abbiamo utilizzato non è un formato valido. Ciò significa che il riferimento (puntatore) che abbiamo utilizzato per identificare un'immagine non è valido. Generalmente, questo è seguito da una descrizione come segue. Questo renderà l'errore molto più chiaro.

formato di riferimento non valido: il nome del repository deve essere minuscolo

Ciò significa che il riferimento che stiamo utilizzando non deve contenere lettere maiuscole. Prova a correre docker run Ubuntu( sbagliato ) contro docker run ubuntu( corretto ). Docker non consente l'uso di caratteri maiuscoli come riferimento per l'immagine. Semplici passaggi per la risoluzione dei problemi.

1) Dockerfile contiene lettere maiuscole come immagini.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Il nome dell'immagine definito nel docker-compose.yml aveva lettere maiuscole

3) Se stai usando Jenkins o GoCD per distribuire il tuo container docker, controlla il comando run, se il nome dell'immagine include una lettera maiuscola.

Si prega di leggere questo documento scritto appositamente per questo errore.


0

Ho avuto lo stesso errore e per qualche motivo sembra essere stato causato da lettere maiuscole nel lavoro Jenkins che ha eseguito il docker runcomando.


0

Ciò sta accadendo a causa degli spazi nella directory di lavoro corrente da cui provengono i $(pwd)volumi della mappa. Quindi, ho usato docker-composeinvece.

Il docker-compose.ymlfile.

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

0

"docker build -f Dockerfile -t SpringBoot-Docker." Come nel consiglio sopra, stiamo creando un file immagine per il contenitore Docker. elogia dice crea file di utilizzo dell'immagine ( -f si riferisce al file docker ) e -t per la destinazione del file immagine che stiamo per inviare a docker. il "." rappresenta la directory corrente

soluzione per il problema precedente: fornire il nome dell'immagine di destinazione in minuscolo


0

Docker può creare immagini automaticamente leggendo le istruzioni da un Dockerfile. Un Dockerfile è un documento di testo che contiene tutti i comandi che un utente può chiamare sulla riga di comando per assemblare un'immagine. esempio: FROM python: 3.7-alpine Il 'python' dovrebbe essere in minuscolo


0

Nel mio caso stavo cercando di eseguire postgres tramite finestra mobile. Inizialmente stavo correndo come:

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

Mi mancava -e dopo ogni variabile d'ambiente. La modifica del comando sopra con quello sotto ha funzionato

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

Vorrei che il messaggio di errore restituisse la stringa del problema. Stavo ottenendo questo a causa di uno strano problema di copia e incolla di un comando "docker run". Prima del repo e del nome dell'immagine veniva utilizzato un carattere simile a uno spazio .


0

La maggior parte delle risposte sopra non ha funzionato per il mio caso, quindi lo documenterò nel caso qualcuno lo trovi utile. La prima riga nel dockerfile FROM node:10per il mio caso, la parola nodo non dovrebbe essere maiuscola, ad es FROM NODE:10. Ho fatto quella modifica e ha funzionato.


0

Nel mio caso DockerFile conteneva il nome dell'immagine in lettere maiuscole invece che minuscole.

Riga precedente nel mio DockerFile

FROM CentOs

e quando ho cambiato sopra a FROM centos, ha funzionato senza problemi.


0

Nel mio caso avevo un --envinterruttore nudo , ovvero uno senza un nome o un valore di variabile effettivo, ad esempio:

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

-2

Prova a utilizzare caratteri minuscoli nel tuo DockerFile

Ad esempio, usa:

openjdk:8

invece di

openJDK:8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.