【问题标题】:Docker error: invalid reference format: repository name must be lowercaseDocker 错误:引用格式无效:存储库名称必须为小写
【发布时间】:2018-01-30 13:28:08
【问题描述】:

我的一个项目遇到了这个 Docker 错误:

invalid reference format: repository name must be lowercase

此一般消息的各种原因是什么?

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

【问题讨论】:

  • 正如 BMitch 在他的回答中解释的那样,此错误消息中的 "reference" 是图像的标识符。所以你用来指向图像的值的格式是无效的。阅读BMitch的完整解释:stackoverflow.com/a/52818152/336694

标签: docker docker-compose


【解决方案1】:

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}

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

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 命令行,经常会导致参数不带空格,弄错命令行的顺序" 这真的很有帮助
  • 解释需要引用路径 docker run -v "$(pwd):/data" image_ref 的部分对我来说很有帮助。
【解决方案2】:

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

好: docker build -t myfirstechoimage:0.1 .

不好: docker build -t myFirstEchoImage:0.1 .

【讨论】:

  • 我在 SpringBoot 项目中使用“spotify”maven 依赖项来构建 docker 映像,从最近几个小时开始,我一直在努力理解这个问题。项目的名称(包含大写字符)原来是问题!
【解决方案3】:

在我的例子中是-e 在mysql 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

还要检查是否缺少空格

【讨论】:

  • 和我一样,我在我的一个环境变量之前缺少-e
  • 在我的情况下,我忘记从外部环境导出变量。
【解决方案4】:

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

【讨论】:

  • 这为我解决了!我将$(pwd) 用引号括起来,它起作用了。
  • 对我来说,我必须转义任何空格字符。
【解决方案5】:

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

【讨论】:

  • 通过网络搜索发现的另一个常见原因是人们在挂载卷时其目录名称中有空格字符。
  • 发生在我身上的原因不同。 Dockerfile 中的 docker 多阶段构建,以大写字母命名。示例:FROM bla:bla AS BUILD 失败。 FROM bla:bla AS build 没问题,谢谢!
【解决方案6】:

就我而言,问题在于参数安排。最初我在环境参数之后有--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']}]"

【讨论】:

    【解决方案7】:

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

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

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

    “Mobile Documents”中路径中的空格似乎是docker run不喜欢的地方。

    【讨论】:

    • 您可以转义空格,而不是复制项目,例如Mobile\ Documents
    【解决方案8】:

    Docker 中的reference 是指向图像的内容。这可能在远程注册表或本地注册表中。让我先描述一下错误信息,然后再给出解决方案。

    参考格式无效

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

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

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

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

    FROM Ubuntu (wrong)
    FROM ubuntu (correct)
    

    2) docker-compose.yml 中定义的图像名称包含大写字母

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

    请阅读专门针对此错误编写的this document

    【讨论】:

      【解决方案9】:

      替换image: ${DOCKER_REGISTRY}notificationsapiimage:notificationsapiimage: ${docker_registry}notificationsapi 在 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
      

      所以我认为错误是由于它有非小写字母

      【讨论】:

        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          确实,截至今天 (sha 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
          

          【讨论】:

            【解决方案12】:

            有时你会在特定的多个环境变量内联时错过 -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>

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

                我解决了这个更改我的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
                

                【讨论】:

                  【解决方案15】:

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

                  在我的例子中,包含我的 Dockerfile 的目录名称是 "My Project",我将其更改为 myprojectmy_project 对我有用。
                  此外,Dockerfile 所在的所有根/超级目录都遵循相同的命名格式。

                  不仅适用于 docker,而且在定义目录名称时避免以下情况也是一种很好的做法(尤其是在 Linux OS 中):-

                  • 空格
                  • 驼色
                  • 大写

                  【讨论】:

                    【解决方案16】:

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

                    【讨论】:

                      【解决方案17】:

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

                      docker-compose.yml 文件。

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

                      【讨论】:

                        【解决方案18】:

                        “docker build -f Dockerfile -t SpringBoot-Docker .” 和上面的推荐一样,我们正在为 docker 容器创建一个镜像文件。推荐说创建图像使用文件(-f 参考 docker 文件)和 -t 用于我们要推送到 docker 的图像文件的目标。这 ”。”表示当前目录

                        上述问题的解决方法:提供小写的目标图片名称

                        【讨论】:

                          【解决方案19】:

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

                          【讨论】:

                            【解决方案20】:

                            就我而言,我试图通过 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

                            【讨论】:

                              【解决方案21】:

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

                              【讨论】:

                                【解决方案22】:

                                上面的大部分答案都不适用于我的案例,所以我会记录下来,以防有人觉得它有帮助。在我的例子中,dockerfile FROM node:10 的第一行,node 这个词不应该是uppercase,即FROM NODE:10。我做了那个改变,它奏效了。

                                【讨论】:

                                  【解决方案23】:

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

                                  我的 DockerFile 中的前一行

                                  FROM CentOs
                                  

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

                                  【讨论】:

                                    【解决方案24】:

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

                                    $ docker run {你的图片}

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2018-07-12
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2019-07-08
                                      • 2021-02-12
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多