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