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

我的一个项目出现了 Docker 错误:

invalid reference format: repository name must be lowercase

这种通用消息的各种原因是什么?

经过一番努力,我已经找到了答案,所以我打算回答我自己的问题,以便在这里记录下来,因为在进行网络搜索时,解决方案并没有马上出现,而且这个错误消息也没有描述 Docker 遇到的直接问题。

287920 次浏览

在我的示例中,在 docker-compose.yml中定义的图像名称包含大写字母。错误消息提到的是 repository而不是 image,这一事实无助于描述问题,而且花了一段时间才弄清楚。

对我来说,问题出在参数安排上。最初我有 --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}notificationsapiimage:notificationsapiimage: ${docker_registry}notificationsapi 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 作业中的大写字母引起的。

在当前工作目录中有一个空格,然后使用 $(pwd)来映射卷,不喜欢目录名中的空格。

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

invalid reference format错误消息意味着 docker 无法将您提供的字符串转换为图像。这可能是一个无效的名称,或者它可能来自 docker run命令行早期的解析错误,如果您是这样运行映像的话。

如果名称本身无效,则 repository name must be lowercase表示在注册表或存储库名称中使用大写字符,例如,YourImageName:latest应该是 yourimagename:latest

对于 docker run命令行,这通常导致没有使用空格引用参数、没有引用参数的值以及错误的命令行顺序。命令行的顺序是:

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

向运行传递参数时最常见的错误是卷映射扩展了包含空间的路径名,但没有引用路径或转义空间。例如。

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

如果您在目录 /home/user/Some Project Dir中,那么将在容器中定义一个匿名卷 /home/user/Some,并尝试使用命令 Dir:/data image_ref运行 Project:latest。解决办法就是引用这个论点:

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

其他常见的错过引用的地方包括环境变量:

docker run -e SOME_VAR=Value With Spaces image_ref

Docker 会将其解释为尝试运行映像 With:latest和命令 Spaces image_ref。同样,修复方法是引用环境参数:

docker run -e "SOME_VAR=Value With Spaces" image_ref

对于复合文件,如果在图像名称中展开变量,则该变量可能无法正确展开。因此,如果你有:

version: 2
services:
app:
image: ${your_image_name}

然后再次检查 your_image_name是否定义为全小写字符串。

对我来说,问题在于卷映射中没有转义的空间。运行 docker run 命令的 jenkins 作业在其中有一个空格,因此 docker 引擎无法理解 docker run 命令。

之所以会出现这种情况,是因为当前工作目录中的空间来自于地图体积的 $(pwd)。所以,我用 docker-compose代替。

docker-compose.yml文件。

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

事实上,到目前为止,docker 注册表(sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305)不处理包含大写字符的路径。这显然是一个糟糕的设计选择,可能是因为希望与某些操作系统保持兼容,而这些操作系统在文件级别上不区分大小写(即 窗户)。

如果对某个范围进行身份验证并尝试以全小写形式获取不存在的存储库,则输出为

(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

让我强调一下 Docker 甚至不允许混合角色。

好: docker build -t myfirstechoimage:0.1 .

坏: docker build -t myFirstEchoImage:0.1 .

在 MacOS 上,当您使用 iCloud 驱动器时,您的 $PWD 将包含一个目录“ Mobile Document”。它似乎不喜欢这个空间!

作为解决方案,我将项目复制到本地驱动器,其中项目文件夹的路径中没有空间。

我看不出有什么办法可以绕过改变 iCloud 的默认路径即 ~/Library/Mobile Documents/com~apple~CloudDocs

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

“ docker build-f Dockerfile-t SpringBoot-Docker” 如上所述,我们正在为 Docker 容器创建一个图像文件。推荐说,创建图像使用文件(- f 请参阅 docker 文件)和-t 为目标的图像文件,我们将推到多克。「代表工作目录

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

Docker 可以通过从 Dockerfile 读取指令来自动构建图像。Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用的所有命令,用于组装图像。 例如: 来自巨蟒: 3.7-阿尔卑斯山 “ python”应该是小写的

在我的案例中,我试图运行 postgres 通过 docker。最初我是运行:

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

每次环境变量之后我都会错过 abc 0,把上面的命令改成下面的命令就可以了

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

有时候,当特定的多个 env 变量内联时,您会错过 -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>

我希望错误消息会输出问题字符串。我得到这个是由于一个奇怪的复制和粘贴问题的“ docker run”命令。在回购和图像名称之前使用了一个 space-喜欢字符。

上面的大多数答案对我的情况都不起作用,所以我将记录下来,以防有人发现它有帮助。在我的案例中,dockerfile FROM node:10中的第一行,单词 节点不应该是 大写,即 FROM NODE:10。我做了改变,而且成功了。

在我的例子中,在 mysql docker 的参数之前是 -e

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

还要检查是否有遗漏的空格

Docker 中的 reference指向图像。这可能位于远程注册表或本地注册表中。让我首先描述错误消息,然后展示解决方案。

无效的引用格式

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

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

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

1) 文件夹包含一个大写字母作为图像。

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2)在 码头作曲中定义的图像名称有大写字母

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

请阅读专门为此错误编写的 这份文件

在我的示例中,DockerFile 以混合大小写而不是小写形式包含图像名称。

DockerFile 的前面一行

FROM CentOs

当我换到 FROM centos的时候,一切都很顺利。

在我的例子中,我有一个裸的 --env开关,即一个没有实际变量名或值的开关,例如:

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

我解决这个问题的方法是改变 Dockerfile上的一些大写字母,比如:

FROM Base as Build
RUN npm run Build:prod

FROM base as build
RUN npm run build:prod

另一个地方:

FROM Base as Release
COPY --from=Build /usr/path/here/dist/ ./dist

FROM base as Release
COPY --from=build /usr/path/here/dist/ ./dist

我在使用 dockermlflow时遇到过同样的问题。

在我的例子中,包含我的 Dockerfile的目录名称是 < strong > “ My Project”,我将其更改为 < strong > myproject My _ project ,它适合我。
此外,对于 Dockerfile所在的所有 root/super 目录,遵循相同的命名格式。

不仅对 docker 而言,在定义目录名时避免以下内容也是很好的做法(特别是在基于 Unix的操作系统中) :-

  • 留白
  • 骆驼箱
  • 大写

您需要输入 Docker-Image 的名称,而不是您的文件名: P

$docker run { your image }

此错误的另一个可能原因是,在 Dockerfile 中,语法声明本身的大小写混合。例如: # syntax=docker/Dockerfile:1 而不是 # syntax=docker/dockerfile:1

如果你在虚张声势(Windows)中遇到这个问题。

@echo off
echo.
docker run --rm -it --env GOPATH=/go -v %CD%:/go/src -w /go/src quay.io/goswagger/swagger %*

使用这个代替: (添加引号)

@echo off
echo.
docker run --rm -it --env GOPATH=/go -v "%CD%:/go/src" -w /go/src quay.io/goswagger/swagger %*