Erreur Docker: format de référence non valide: le nom du référentiel doit être en minuscules


86

Ran dans cette erreur Docker avec l'un de mes projets:

invalid reference format: repository name must be lowercase

Quelles sont les différentes causes de ce message générique?

Je l'ai déjà compris après quelques efforts, je vais donc répondre à ma propre question afin de la documenter ici car la solution ne vient pas tout de suite lors d'une recherche sur le Web et aussi parce que ce message d'erreur ne décrit pas le problème direct que rencontre Docker.


"référence" dans ce message d'erreur est l'identifiant d'une image, comme l'explique BMitch dans sa réponse. Le format de la valeur que vous avez utilisé pour pointer vers une image n'est donc pas valide. Lisez l'explication complète de BMitch: stackoverflow.com/a/52818152/336694
HostedMetrics.com

Réponses:


78

Une «référence» dans le menu fixe est un pointeur vers une image. Il peut s'agir d'un nom d'image, d'un identifiant d'image, d'inclure un serveur de registre dans le nom, d'utiliser une balise sha256 pour épingler l'image et de tout autre élément pouvant être utilisé pour pointer vers l'image que vous souhaitez exécuter.

Le invalid reference formatmessage d'erreur signifie que docker ne peut pas convertir la chaîne que vous avez fournie en image. Il peut s'agir d'un nom non valide ou d'une erreur d'analyse plus tôt dans la docker runligne de commande si c'est ainsi que vous exécutez l'image. Avec un fichier de composition, si vous développez une variable dans le nom de l'image, cette variable peut ne pas se développer correctement.

Avec la docker runligne de commande, c'est souvent le résultat de ne pas citer les paramètres avec des espaces et de se tromper dans l'ordre de la ligne de commande. La ligne de commande est classée comme suit:

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

L'erreur la plus courante lors du passage d'arguments à l'exécution est un mappage de volume développant un nom de chemin qui comprend un espace, et ne citant pas le chemin ou n'échappant pas à l'espace. Par exemple

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

Et la solution est aussi simple que:

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

3
"Avec la ligne de commande de l'exécution du docker, c'est souvent le résultat de ne pas citer les paramètres avec des espaces et de se tromper dans l'ordre de la ligne de commande" Cela a été vraiment utile
user979899

Post extrêmement utile même 2 ans après!
Geo

A fonctionné parfaitement. Merci!
Igor Melão

24

Permettez-moi de souligner que Docker n'autorise même pas les caractères mixtes.

Bien: docker build -t myfirstechoimage:0.1 .

Mal: docker build -t myFirstEchoImage:0.1 .


1
Wow, cela a sauvé beaucoup d'efforts!
curieux le

1
J'utilise la dépendance maven "spotify" dans le projet SpringBoot pour créer l'image docker et depuis quelques heures, j'avais du mal à comprendre le problème. Le nom du projet (contient des majuscules) se révèle être le problème!
Abhishek Aggarwal

15

avait un espace dans le répertoire de travail actuel et utilisait $(pwd)pour mapper les volumes. N'aime pas les espaces dans les noms de répertoire.


2
Cela l'a résolu pour moi! J'ai mis $(pwd)entre guillemets et cela a fonctionné.
MerseyViking

14

Dans mon cas, c'était -eavant les paramètres de 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

Vérifiez également s'il manque des espaces blancs


5
Pareil pour moi, il me manquait l' -eavant une de mes variables d'environnement.
Eric Bishard le

dans mon cas, j'ai oublié d'exporter la variable de l'environnement externe.
Przemek

8

Dans mon cas, le nom de l'image défini dans docker-compose.ymlcontenait des lettres majuscules. Le fait que le message d'erreur mentionnérepository au lieu de imagen'a pas aidé à décrire le problème et il a fallu un certain temps pour le comprendre.


1
Une autre cause fréquente trouvée en recherchant sur le Web était que les personnes avaient des espaces dans leurs noms de répertoire lors du montage de volumes.
HostedMetrics.com

Cela m'est arrivé pour une raison différente. La construction multi-étapes du docker dans un Dockerfile comme nommé avec des lettres majuscules. Exemple: FROM bla:bla AS BUILDéchoué. FROM bla:bla AS buildétait OK Thx!
Anderson Marques

8

Dans mon cas, le problème était dans la disposition des paramètres. Au départ, j'avais le --nameparamètre après les paramètres d'environnement, puis le volume et les attach_dbs paramètres, et l'image à la fin de la commande comme ci-dessous.

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

Après avoir réorganisé les paramètres comme ci-dessous, tout a bien fonctionné (en gros, mettre le --nameparamètre suivi du nom de l'image).

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

Sur MacOS lorsque vous travaillez sur un lecteur iCloud, votre $ PWD contiendra un répertoire "Documents mobiles". Il ne semble pas aimer l'espace!

Pour contourner le problème, j'ai copié mon projet sur un lecteur local où il n'y a pas d'espace dans le chemin d'accès à mon dossier de projet.

Je ne vois pas de moyen de contourner le changement du chemin par défaut vers iCloud qui est ~/Library/Mobile Documents/com~apple~CloudDocs

L'espace dans le chemin dans "Documents mobiles" semble être ce que l'exécution de docker n'aime pas.


1
Au lieu de copier le projet, vous pouvez échapper à l'espace, par exemple Mobile\ Documents
efru

1

Remplacer image: ${DOCKER_REGISTRY}notificationsapi par image:notificationsapi ou image: ${docker_registry}notificationsapi dans docker-compose.yml résout le problème

fichier avec erreur

  version: '3.4'

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

fichier sans erreur

version: '3.4'

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

Donc, je pense que l'erreur était due à des lettres non minuscules qu'il avait


1

Pour moi, le problème était avec l'espace dans le mappage de volume qui n'a pas été échappé. Le travail jenkins qui exécutait la commande docker run contenait un espace et par conséquent, le moteur docker n'était pas en mesure de comprendre la commande docker run.


1

En effet, le registre docker à ce jour (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) ne gère pas les chemins contenant des caractères majuscules. C'est évidemment un mauvais choix de conception, probablement dû à la volonté de maintenir la compatibilité avec certains systèmes d'exploitation qui ne distinguent pas la casse au niveau du fichier (ie, Windows ).

Si l'on s'authentifie pour une portée et tente d'extraire un référentiel non existant avec toutes les minuscules, la sortie est

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

Cependant, si l'on essaie de faire cela avec un composant majuscule, seul 404 est renvoyé:

(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

parfois vous manquez l'indicateur -e alors que plusieurs variables d'environnement spécifiques sont en ligne

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

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


1

Un referencedans Docker est ce qui pointe vers une image. Cela peut être dans un registre distant ou dans le registre local. Permettez-moi de décrire d'abord le message d'erreur, puis de montrer les solutions pour cela.

format de référence non valide

Cela signifie que la référence que nous avons utilisée n'est pas un format valide. Cela signifie que la référence (pointeur) que nous avons utilisée pour identifier une image n'est pas valide. Généralement, ceci est suivi d'une description comme suit. Cela rendra l'erreur beaucoup plus claire.

format de référence non valide: le nom du référentiel doit être en minuscules

Cela signifie que la référence que nous utilisons ne doit pas avoir de lettres majuscules. Essayez d'exécuter docker run Ubuntu( faux ) vs docker run ubuntu( correct ). Docker n'autorise pas les caractères majuscules comme référence d'image. Étapes de dépannage simples.

1) Dockerfile contient des lettres majuscules sous forme d'images.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Le nom de l'image défini dans le fichier docker-compose.yml avait des lettres majuscules

3) Si vous utilisez Jenkins ou GoCD pour déployer votre conteneur docker, veuillez vérifier la commande run, si le nom de l'image comprend une majuscule.

Veuillez lire ce document rédigé spécifiquement pour cette erreur.


0

J'ai eu la même erreur, et pour une raison quelconque, cela semble avoir été causé par des lettres majuscules dans le travail Jenkins qui exécutait la docker runcommande.


0

Cela se produit en raison des espaces dans le répertoire de travail actuel provenant $(pwd)des volumes de carte. Donc, j'ai utilisé à la docker-composeplace.

Le docker-compose.ymldossier.

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." Comme dans la recommandation ci-dessus, nous créons un fichier image pour le conteneur Docker. commend dit créer un fichier d'utilisation d'image ( -f se réfère au fichier docker ) et -t pour la cible du fichier image que nous allons pousser vers docker. le "." représente le répertoire courant

solution pour le problème ci-dessus: indiquez le nom de l'image cible en minuscules


0

Docker peut créer des images automatiquement en lisant les instructions à partir d'un Dockerfile. Un Dockerfile est un document texte qui contient toutes les commandes qu'un utilisateur peut appeler sur la ligne de commande pour assembler une image. exemple: FROM python: 3.7-alpine Le 'python' doit être en minuscules


0

Dans mon cas, j'essayais d'exécuter postgres via docker. Au départ, je courais en tant que:

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

Il me manquait -e après chaque variable d'environnement. Changer la commande ci-dessus en celle ci-dessous a fonctionné

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

Je souhaite que le message d'erreur affiche la chaîne de problème. J'obtenais ceci en raison d'un problème étrange de copier-coller d'une commande "docker run". Un caractère de type espace était utilisé avant le nom du référentiel et de l'image.


0

La plupart des réponses ci-dessus n'ont pas fonctionné pour mon cas, donc je vais documenter cela au cas où quelqu'un trouverait cela utile. La première ligne du fichier dockerfile FROM node:10pour mon cas, le mot node ne doit pas être en majuscule, c'est-à-dire FROM NODE:10. J'ai fait ce changement et cela a fonctionné.


0

Dans mon cas, DockerFile contenait le nom de l'image en casse mixte au lieu de minuscules.

Ligne précédente dans mon DockerFile

FROM CentOs

et quand j'ai changé ci-dessus FROM centos, cela a fonctionné sans problème.


0

Dans mon cas, j'avais un --envswitch nu , c'est-à-dire sans nom de variable ni valeur réelle, par exemple:

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

-2

Essayez d'utiliser des caractères minuscules dans votre DockerFile

Par exemple, utilisez:

openjdk:8

au lieu de

openJDK:8
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.