Couru 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 se présente pas immédiatement lors d'une recherche Web et parce que ce message d'erreur ne décrit pas le problème direct rencontré par Docker.
Dans mon cas, le problème était dans l'arrangement des paramètres. Initialement, j'avais le paramètre --name
après les paramètres d'environnement, puis les paramètres volume et attach_dbs
, ainsi qu'une 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 mettant le paramètre --name
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']}]"
avait un espace dans le répertoire de travail actuel et utilisait $(pwd)
pour mapper des volumes. N'aime pas les espaces dans les noms de répertoires.
Une "référence" dans le menu fixe est un pointeur sur une image. Il peut s'agir d'un nom d'image, d'un identifiant d'image, d'un serveur de registre, d'une balise sha256 pour épingler l'image et de tout autre élément pouvant être utilisé pour pointer sur l'image que vous souhaitez exécuter.
Le message d'erreur invalid reference format
signifie que docker ne peut pas convertir la chaîne que vous avez fournie en une image. Ce nom peut être incorrect ou provenir d'une erreur d'analyse plus tôt dans la ligne de commande docker run
, 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 risque de ne pas être développée correctement.
Avec la ligne de commande docker run
, il arrive souvent que les paramètres ne soient pas cotés par des espaces et que l’ordre de la ligne de commande soit erroné. 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 des arguments à l'exécution est un mappage de volume développant un nom de chemin qui inclut un espace, et ne cite pas le chemin ni ne le libère. Par exemple.
docker run -v $(pwd):/data image_ref
Et la solution est aussi simple que:
docker run -v "$(pwd):/data" image_ref
Dans mon cas, le nom d'image défini dans docker-compose.yml
contenait des lettres majuscules. Le fait que le message d'erreur mentionne repository
au lieu de image
n'aide pas à décrire le problème et qu'il a fallu un certain temps pour le résoudre.
Sur MacOS lorsque vous travaillez sur un lecteur iCloud, votre $ PWD contiendra un répertoire "Documents mobiles". Il ne semble pas aimer l'espace!
En guise de solution de contournement, j'ai copié mon projet sur un lecteur local où il n'y a pas d'espace dans le chemin d'accès au dossier de projet.
Je ne vois pas comment vous pouvez contourner le chemin d'accès par défaut à 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.
Permettez-moi de souligner que Docker ne permet même pas les caractères mélangés.
Bien: docker build -t myfirstechoimage:0.1 .
Mal: docker build -t myFirstEchoImage:0.1 .
J'ai eu la même erreur, et pour une raison quelconque, cela semble avoir été provoqué par des lettres majuscules dans le travail Jenkins qui a exécuté la commande docker run
.
En remplaçant image: ${DOCKER_REGISTRY}notificationsapi
Par image:notificationsapi
Ou image: ${docker_registry}notificationsapi
in, docker-compose.yml a résolu 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 aux lettres non minuscules qu'il avait
Pour moi, le problème était lié à l'espace de mappage de volume qui n'a pas été échappé. Le travail Jenkins qui exécutait la commande d'exécution du menu fixe avait un espace et par conséquent, le moteur du menu fixe n'était pas en mesure de comprendre la commande d'exécution du menu fixe.
Cela est dû aux espaces du répertoire de travail actuel provenant de $(pwd)
pour les volumes de carte. Donc, j'ai utilisé docker-compose
à la place.
Le fichier docker-compose.yml
.
version: '3'
services:
react-app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- /app/node_modules
- .:/app
En effet, le registre de menu fixe à ce jour (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
) ne gère pas les chemins contenant des caractères majuscules. Il s’agit bien évidemment d’un choix de conception peu judicieux, probablement dû à la volonté de rester compatible avec certains systèmes d’exploitation qui ne font pas la distinction entre les casse au niveau du fichier (par exemple, windows ).
Si on s'authentifie pour une étendue et essaie 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"}]}]}
Toutefois, si l’on essaie de le faire avec un composant majuscule, seul le code 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