Docker错误:无效的引用格式:存储库名称必须为小写


86

使用我的一个项目遇到此Docker错误:

invalid reference format: repository name must be lowercase

产生此通用消息的各种原因是什么?

经过一些努力,我已经弄清楚了,所以我将回答我自己的问题,以便在此处进行记录,因为在进行网络搜索时解决方案不会立即出现,并且因为此错误消息并未描述Docker遇到的直接问题。


如BMitch在他的回答中所解释的,此错误消息中的“引用”是图像的标识符。因此,您用来指向图像的值的格式无效。阅读BMitch的完整说明:stackoverflow.com/a/52818152/336694
HostedMetrics.com

Answers:


78

泊坞窗中的“引用”是指向图像的指针。它可以是映像名称,映像ID,名称中包括注册表服务器,使用sha256标记固定映像以及可以用于指向要运行的映像的任何其他内容。

invalid reference format错误消息表示docker无法将您提供的字符串转换为图像。这可能是无效的名称,或者可能是来自docker run命令行前面的解析错误的(如果您使用的是这种方式)。对于撰写文件,如果在图像名称中扩展变量,则该变量可能无法正确扩展。

docker run命令行中,这通常是导致不用空格引用参数,并且误认为命令行顺序的结果。命令行顺序为:

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

将args传递给运行时最常见的错误是卷映射扩展了路径名,该路径名中包含空格,而不引用路径或转义该空格。例如

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

修复很简单:

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

3
“使用docker run命令行,这通常是导致不使用空格引用参数,而导致命令行顺序错误的结果。”这确实很有帮助
user979899

即使在2年后,还是非常有帮助的帖子!
地理

做得完美。谢谢!
IgorMelão

24

让我强调一下,Docker甚至不允许混合字符。

好: docker build -t myfirstechoimage:0.1 .

坏: docker build -t myFirstEchoImage:0.1 .


1
哇,这省了很多功夫!
好奇的

1
我在SpringBoot项目中使用“ spotify” maven依赖关系来构建docker映像,从最近几个小时开始,我一直在努力了解问题。原来是项目名称(包含大写字母)!
Abhishek Aggarwal

15

当前工作目录中有一个空格,可$(pwd)用于映射卷。不喜欢目录名称中的空格。


2
那为我解决了!我用$(pwd)引号把它包裹住了。
MerseyViking

14

就我而言是-emysql 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

还要检查是否缺少空格


5
和我一样,我缺少-e环境变量之前的一个。
埃里克·比斯哈德

就我而言,我忘记了从外部环境导出变量。
Przemek

8

就我而言,图片名称定义为docker-compose.yml包含大写字母。提到的错误消息repository而不是错误的事实image并不能帮助描述问题,因此花了一些时间才弄清楚。


1
通过网络搜索的另一个常见原因是,安装卷时,人们在目录名称中带有空格字符。
HostedMetrics.com

发生在我身上的原因有所不同。Dockerfile内的docker多阶段构建,以大写字母命名。示例: FROM bla:bla AS BUILD失败。FROM bla:bla AS build还行,谢谢!
安德森·马克斯

8

就我而言,问题在于参数安排。最初,我--name在环境参数之后有参数,然后是体积和attach_dbs 参数,并在命令末尾有图像,如下所示。

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

像下面这样重新排列参数后,一切正常(基本上是在--name参数后面加上图像名称)。

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

在MacOS上,当您在iCloud驱动器上工作时,$ PWD将包含目录“ Mobile Documents”。它似乎不喜欢该空间!

解决方法是,将项目复制到本地驱动器,该文件夹在路径中没有空间。

我看不到有办法绕开iCloud的默认路径changnig ~/Library/Mobile Documents/com~apple~CloudDocs

“移动文档”中路径中的空间似乎是docker run不喜欢的。


1
无需复制项目,您可以转义空格,例如 Mobile\ Documents
efru

1

更换image: ${DOCKER_REGISTRY}notificationsapiimage:notificationsapiimage: ${docker_registry}notificationsapi 在泊坞窗,compose.yml根本解决问题

错误文件

  version: '3.4'

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

文件没有错误

version: '3.4'

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

所以我认为错误是由于非小写字母引起的



1

的确,截至今天(docker 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305),docker注册表不处理包含大写字符的路径。这显然是一个糟糕的设计选择,可能是由于想要与某些在文件级别(例如Windows)不区分大小写的操作系统保持兼容。

如果对一个范围进行身份验证并尝试获取所有小写字母的不存在存储库,则输出为

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

但是,如果尝试使用大写组件执行此操作,则仅返回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

有时在特定的多个环境变量内联时会错过-e标志

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

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


1

referenceDocker中的A指向映像。这可以在远程注册表或本地注册表中。首先让我描述错误消息,然后显示解决方案。

参考格式无效

这意味着我们使用的引用不是有效格式。这意味着我们用来识别图像的参考(指针)无效。通常,其后进行如下描述。这将使错误更加清楚。

无效的参考格式:存储库名称必须为小写

这意味着我们正在使用的引用不应包含大写字母。尝试运行docker run Ubuntu错误)vs docker run ubuntu正确)。Docker不允许任何大写字符作为图像引用。简单的故障排除步骤。

1)Dockerfile包含一个大写字母作为图像。

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2)在docker-compose.yml中定义的映像名称具有大写字母

3)如果您使用的是Jenkins或GoCD来部署docker容器,请检查run命令,镜像名称是否包含大写字母。

请阅读专门针对此错误编写的本文档


0

我有同样的错误,由于某种原因,它似乎是由运行该docker run命令的Jenkins作业中的大写字母引起的。


0

发生这种情况是因为当前工作目录中的空间来自$(pwd)于地图卷。因此,我docker-compose改用了。

docker-compose.yml文件。

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。” 就像上面的推荐一样,我们正在为docker容器创建一个图像文件。建议说创建映像使用文件(-f表示docker file),而-t表示要推送到docker的映像文件的目标。“。” 代表当前目录

上述问题的解决方案:以小写形式提供目标图像名称


0

Docker可以通过阅读Dockerfile中的指令来自动构建映像。Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装映像的所有命令。示例:FROM python:3.7-alpine“ python”应为小写


0

就我而言,我试图通过docker运行postgres。最初我的运行方式是:

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

在每个环境变量之后我都缺少-e。将上面的命令更改为下面的命令

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

我希望错误消息将输出问题字符串。由于“ docker run”命令的奇怪的复制和粘贴问题,我得到了这个。回购和图片名称之前使用了类似空格的字符。


0

上面的大多数答案都不适用于我的情况,因此,如果有人觉得有帮助,我将对此进行记录。FROM node:10对于我的情况,在dockerfile中的第一行,单词node不应为大写,FROM NODE:10。我进行了更改,并成功了。


0

在我的情况下,DockerFile包含映像名称,大小写混合,而不是小写。

我的DockerFile中的前一行

FROM CentOs

当我更改为时FROM centos,它运行顺利。


0

就我而言,我有一个裸--env开关,即没有实际的变量名称或值的开关,例如:

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

-2

尝试在DockerFile中使用小写字符

例如,使用:

openjdk:8

代替

openJDK:8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.