Erro do Docker: formato de referência inválido: o nome do repositório deve ser minúsculo

86

Encontrei este erro do Docker com um dos meus projetos:

invalid reference format: repository name must be lowercase

Quais são as várias causas para esta mensagem genérica?

Já descobri depois de algum esforço, então vou responder minha própria pergunta a fim de documentá-la aqui, já que a solução não surge imediatamente ao fazer uma pesquisa na web e também porque essa mensagem de erro não descreve o problema direto que o Docker encontra.

HostedMetrics.com
fonte
"referência" nesta mensagem de erro é o identificador de uma imagem, como BMitch explicou em sua resposta. Portanto, o formato do valor que você usou para apontar para uma imagem é inválido. Leia a explicação completa da BMitch: stackoverflow.com/a/52818152/336694
HostedMetrics.com

Respostas:

78

Uma "referência" no docker é um ponteiro para uma imagem. Pode ser um nome de imagem, um ID de imagem, incluir um servidor de registro no nome, usar uma tag sha256 para fixar a imagem e qualquer outra coisa que possa ser usada para apontar para a imagem que você deseja executar.

A invalid reference formatmensagem de erro significa que o docker não pode converter a string fornecida em uma imagem. Este pode ser um nome inválido ou pode ser de um erro de análise anterior na docker runlinha de comando, se é assim que você executa a imagem. Com um arquivo de composição, se você expandir uma variável no nome da imagem, essa variável pode não ser expandida corretamente.

Com a docker runlinha de comando, isso geralmente resulta em não citar parâmetros com espaços e confundir a ordem da linha de comando. A linha de comando é ordenada como:

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

O erro mais comum ao passar args para a execução é um mapeamento de volume expandindo um nome de caminho que inclui um espaço nele, e não citando o caminho ou escapando do espaço. Por exemplo

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

E a correção é tão fácil quanto:

docker run -v "$(pwd):/data" image_ref
BMitch
fonte
3
"Com a linha de comando docker run, isso geralmente resulta em não citar parâmetros com espaços e confundir a ordem da linha de comando" Isso foi realmente útil
user979899
Postagem extremamente útil mesmo 2 anos depois!
Geo
Funcionou perfeito. Obrigado!
Igor Melão 11/10
24

Deixe-me enfatizar que o Docker nem mesmo permite caracteres mistos.

Boa: docker build -t myfirstechoimage:0.1 .

Mau: docker build -t myFirstEchoImage:0.1 .

Z3d4s
fonte
1
Uau, isso economizou muito esforço!
inquisitivo
1
Estou usando a dependência do maven "spotify" no projeto SpringBoot para construir a imagem do docker e, nas últimas horas, estava lutando para entender o problema. O nome do projeto (contém letras maiúsculas) acabou por ser o problema!
Abhishek Aggarwal
15

tinha um espaço no diretório de trabalho atual e usign $(pwd)para mapear volumes. Não gosta de espaços em nomes de diretório.

Colin Claverie
fonte
2
Isso resolveu para mim! Eu envolvi $(pwd)entre aspas e funcionou.
MerseyViking
14

No meu caso era o -eantes dos parâmetros para o 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

Verifique também se há espaços em branco ausentes

Jöcker
fonte
5
O mesmo comigo, eu estava perdendo -euma das variáveis ​​de ambiente anteriores.
Eric Bishard
no meu caso esqueci de exportar variável de ambiente externo.
Przemek
8

No meu caso, o nome da imagem definido em docker-compose.ymlletras maiúsculas. O fato de a mensagem de erro mencionada em repositoryvez de imagenão ajudar a descrever o problema e demorar um pouco para descobrir.

HostedMetrics.com
fonte
1
Outra causa comum encontrada ao pesquisar na web foi que as pessoas têm caracteres de espaço em seus nomes de diretório ao montar volumes.
HostedMetrics.com
Aconteceu comigo por um motivo diferente. A compilação de vários estágios do docker dentro de um Dockerfile nomeada com letras maiúsculas. Exemplo: FROM bla:bla AS BUILDfalhou. FROM bla:bla AS buildfoi OK Thx!
Anderson Marques de
8

No meu caso o problema estava no arranjo dos parâmetros. Inicialmente eu tinha --nameparâmetros após parâmetros de ambiente e depois volume e attach_dbs parâmetros, e imagem no final do comando como abaixo.

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

Depois de reorganizar os parâmetros como abaixo, tudo funcionou bem (basicamente colocando o --nameparâmetro seguido do nome da imagem).

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']}]"
josip.k
fonte
4

No MacOS, quando você estiver trabalhando em uma unidade iCloud, seu $ PWD conterá um diretório "Documentos móveis". Parece não gostar do espaço!

Como solução alternativa, copiei meu projeto para a unidade local onde não há espaço no caminho para a pasta do meu projeto.

Não vejo uma maneira de contornar a alteração do caminho padrão para o iCloud, que é ~/Library/Mobile Documents/com~apple~CloudDocs

O espaço no caminho em "Documentos móveis" parece ser o que o docker run não gosta.

user279838
fonte
1
Em vez de copiar o projeto, você pode escapar do espaço, por exemplo Mobile\ Documents
efru
1

Substituindo image: ${DOCKER_REGISTRY}notificationsapi por image:notificationsapi ou image: ${docker_registry}notificationsapi em docker-compose.yml resolveu o problema

arquivo com erro

  version: '3.4'

services:
  notifications.api:
    image: ${DOCKER_REGISTRY}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

arquivo sem erro

version: '3.4'

services:
 notifications.api:
    image: ${docker_registry}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

Acho que o erro foi devido a letras não minúsculas

nandithakw
fonte
1

Para mim, o problema era com o espaço no mapeamento de volume que não escapou. O trabalho jenkins que estava executando o comando docker run tinha um espaço e, como resultado, o mecanismo docker não foi capaz de entender o comando docker run.

Vipul Malgotra
fonte
1

Na verdade, o registro docker a partir de hoje (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) não controla caminhos que contêm caracteres em maiúsculas. Esta é obviamente uma escolha de design ruim, provavelmente devido ao desejo de manter a compatibilidade com certos sistemas operacionais que não distinguem maiúsculas de minúsculas no nível do arquivo (ou seja, janelas ).

Se alguém autenticar para um escopo e tentar buscar um repositório inexistente com todas as letras minúsculas, a saída será

(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"}]}]}

No entanto, se alguém tentar fazer isso com um componente em maiúsculas, apenas 404 será retornado:

(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
Otheus
fonte
1

às vezes você perde o sinalizador -e enquanto vários env vars específicos em linha

por exemplo, ruim: docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>

Boa: docker run --name somecontainername -e ENV_VAR1=somevalue1 -e ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>

Gaurav Arora
fonte
1

No referenceDocker é o que aponta para uma imagem. Isso pode ser em um registro remoto ou no registro local. Deixe-me descrever a mensagem de erro primeiro e depois mostrar as soluções para isso.

formato de referência inválido

Isso significa que a referência que usamos não é um formato válido. Isso significa que a referência (ponteiro) que usamos para identificar uma imagem é inválida. Geralmente, isso é seguido por uma descrição como segue. Isso tornará o erro muito mais claro.

formato de referência inválido: o nome do repositório deve ser minúsculo

Isso significa que a referência que estamos usando não deve ter letras maiúsculas. Tente executar docker run Ubuntu( errado ) vs docker run ubuntu( correto ). O Docker não permite caracteres maiúsculos como referência de imagem. Etapas de solução de problemas simples.

1) Dockerfile contém letras maiúsculas como imagens.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Nome da imagem definido no docker-compose.yml tinha letras maiúsculas

3) Se você estiver usando Jenkins ou GoCD para implantar seu contêiner do docker, verifique o comando run, se o nome da imagem inclui uma letra maiúscula.

Leia este documento escrito especificamente para esse erro.

Keet Sugathadasa
fonte
0

Eu tive o mesmo erro e, por algum motivo, ele parece ter sido causado por letras maiúsculas no trabalho do Jenkins que executou o docker runcomando.

Kenneho
fonte
0

Isso está acontecendo por causa dos espaços no diretório de trabalho atual que vieram $(pwd)para os volumes do mapa. Então, eu usei em seu docker-composelugar.

O docker-compose.ymlarquivo.

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

"docker build -f Dockerfile -t SpringBoot-Docker." Como na recomendação acima, estamos criando um arquivo de imagem para o docker container. elogio diz criar arquivo de uso de imagem ( -f referir-se ao arquivo docker ) e -t para o destino do arquivo de imagem que iremos enviar para o docker. a "." representa o diretório atual

solução para o problema acima: forneça o nome da imagem alvo em letras minúsculas

Karthik Wodeyar
fonte
0

O Docker pode construir imagens automaticamente lendo as instruções de um Dockerfile. Um Dockerfile é um documento de texto que contém todos os comandos que um usuário pode chamar na linha de comando para montar uma imagem. exemplo: FROM python: 3.7-alpine O 'python' deve estar em minúsculas

HizikNewton
fonte
0

No meu caso, eu estava tentando executar o postgres por meio do docker. Inicialmente eu estava funcionando como:

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

Eu estava faltando -e após cada variável de ambiente. Alterar o comando acima para o abaixo funcionou

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

Mohammed Siddiq
fonte
0

Gostaria que a mensagem de erro gerasse a string do problema. Eu estava recebendo isso devido a um problema estranho de copiar e colar de um comando "docker run". Um caractere semelhante a um espaço estava sendo usado antes do repo e do nome da imagem.

Jamshid
fonte
0

A maioria das respostas acima não funcionou para o meu caso, portanto, documentarei isso, caso alguém considere útil. A primeira linha do dockerfile FROM node:10para o meu caso, a palavra não deve ser maiúscula, ou seja FROM NODE:10. Eu fiz essa mudança e funcionou.

Shadrack Mwangi
fonte
0

No meu caso, DockerFile continha o nome da imagem em letras maiúsculas e não em letras minúsculas.

Linha anterior em meu DockerFile

FROM CentOs

e quando mudei acima para FROM centos, funcionou sem problemas.

Sambhav Pandey
fonte
0

No meu caso, eu tinha um --envswitch simples , ou seja, um sem um nome ou valor de variável real, por exemplo:

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

Tente usar caracteres minúsculos em seu DockerFile

Por exemplo, use:

openjdk:8

ao invés de

openJDK:8
Jon
fonte