使用我的一个项目遇到此Docker错误:
invalid reference format: repository name must be lowercase
产生此通用消息的各种原因是什么?
经过一些努力,我已经弄清楚了,所以我将回答我自己的问题,以便在此处进行记录,因为在进行网络搜索时解决方案不会立即出现,并且因为此错误消息并未描述Docker遇到的直接问题。
使用我的一个项目遇到此Docker错误:
invalid reference format: repository name must be lowercase
产生此通用消息的各种原因是什么?
经过一些努力,我已经弄清楚了,所以我将回答我自己的问题,以便在此处进行记录,因为在进行网络搜索时解决方案不会立即出现,并且因为此错误消息并未描述Docker遇到的直接问题。
Answers:
泊坞窗中的“引用”是指向图像的指针。它可以是映像名称,映像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
让我强调一下,Docker甚至不允许混合字符。
好:
docker build -t myfirstechoimage:0.1 .
坏:
docker build -t myFirstEchoImage:0.1 .
就我而言,图片名称定义为docker-compose.yml
包含大写字母。提到的错误消息repository
而不是错误的事实image
并不能帮助描述问题,因此花了一些时间才弄清楚。
FROM bla:bla AS BUILD
失败。FROM bla:bla AS build
还行,谢谢!
就我而言,问题在于参数安排。最初,我--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']}]"
更换image: ${DOCKER_REGISTRY}notificationsapi
用image:notificationsapi
或 image: ${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
所以我认为错误是由于非小写字母引起的
对我来说,问题在于卷映射中无法逃脱的空间。运行docker run命令的jenkins作业中有一个空格,结果docker引擎无法理解docker run命令。
的确,截至今天(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
有时在特定的多个环境变量内联时会错过-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>
reference
Docker中的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命令,镜像名称是否包含大写字母。
请阅读专门针对此错误编写的本文档。
“ docker build -f Dockerfile -t SpringBoot-Docker。” 就像上面的推荐一样,我们正在为docker容器创建一个图像文件。建议说创建映像使用文件(-f表示docker file),而-t表示要推送到docker的映像文件的目标。“。” 代表当前目录
上述问题的解决方案:以小写形式提供目标图像名称
就我而言,我试图通过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
在我的情况下,DockerFile包含映像名称,大小写混合,而不是小写。
我的DockerFile中的前一行
FROM CentOs
当我更改为时FROM centos
,它运行顺利。