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

Docker错误:引用格式无效:存储库名称必须为小写,docker,docker-compose,Docker,Docker Compose,在我的一个项目中遇到此Docker错误: 引用格式无效:存储库名称必须为小写 产生这种一般信息的各种原因是什么 经过一番努力,我已经找到了答案,所以我将回答我自己的问题,以便在这里记录下来,因为在进行web搜索时,解决方案不会立即出现,而且因为此错误消息没有描述Docker遇到的直接问题。在我的例子中,docker compose.yml中定义的图像名称包含大写字母。事实上,所提到的错误消息是存储库而不是图像,这无助于描述问题,并且花了一段时间才弄清楚。在我的案例中,问题在于参数排列。最初,我在

在我的一个项目中遇到此Docker错误:

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

产生这种一般信息的各种原因是什么


经过一番努力,我已经找到了答案,所以我将回答我自己的问题,以便在这里记录下来,因为在进行web搜索时,解决方案不会立即出现,而且因为此错误消息没有描述Docker遇到的直接问题。

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

在我的案例中,问题在于参数排列。最初,我在环境参数之后有
--name
参数,然后是volume和
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\u REGISTRY}通知SAPI
使用
图像:notificationsapi
image:${docker\u registry}通知SAPI
在docker-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作业中的大写字母引起的

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

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

无效引用格式
错误消息意味着docker无法将您提供的字符串转换为图像。这可能是一个无效的名称,或者它可能来自前面的
docker run
命令行中的解析错误(如果您是这样运行映像的)。对于撰写文件,如果展开图像名称中的变量,则该变量可能无法正确展开

使用
docker run
命令行时,这通常会导致不使用空格引用参数,以及错误地执行命令行的顺序。命令行的顺序如下:

docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_to_exec}
向运行传递参数时最常见的错误是卷映射扩展包含空格的路径名,而不引用路径或转义空格。例如

docker run -v $(pwd):/data image_ref
解决方法非常简单:

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

对我来说,问题在于卷映射中没有转义的空间。运行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
2E2F2F252F3C88679F1207D87D57C07AF6819A17E22573BCEF32804122D2F305
)不处理包含大写字符的路径。这显然是一个糟糕的设计选择,可能是因为想要保持与某些在文件级别不区分大小写的操作系统(即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

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

好:
docker构建-t myfirstechoimage:0.1。

坏:
docker build-t myFirstEchoImage:0.1。

在MacOS上,当您在iCloud驱动器上工作时,$PWD将包含一个目录“移动文档”。它似乎不喜欢这个空间

作为一种解决方法,我将项目复制到本地驱动器,在该驱动器中,项目文件夹的路径中没有空间

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

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

docker build-f Dockerfile-t SpringBoot docker。“ 如上所述,我们正在为docker容器创建一个图像文件。我们将创建图像使用文件(-f指docker文件)和-t作为我们要推送到docker的图像文件的目标。“.”表示当前目录


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

Docker可以通过读取Dockerfile中的指令自动生成映像。Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。 例子: 来自python:3.7-1
“python”应该是小写的

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

docker run-d-p 5432:5432-e POSTGRES\u PASSWORD=test\u PASSWORD POSTGRES\u USER=test\u USER POSTGRES\u DB=test\u DB--rm-v~/docker/volumes/POSTGRES:/var/lib/postgresql/data--name pg docker POSTGRES

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

docker run-d-p 5432:5432-e POSTGRES\u PASSWORD=test\u PASSWORD-e POSTGRES\u USER=test\u USER-e POSTGRES\u DB=test\u DB--rm-v~/docker/volumes/POSTGRES:/var/lib/postgresql/data
(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 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
FROM Ubuntu (wrong)
FROM ubuntu (correct)
FROM CentOs
docker run \
   --env \       <----- This was the offending item
   --rm \
   --volume "/home/shared:/shared" "$(docker build . -q)"
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