Ошибка докера: неверный ссылочный формат: имя репозитория должно быть строчным

Выиграл эту ошибку Docker с одним из моих проектов:

invalid reference format: repository name must be lowercase

Каковы различные причины этого общего сообщения?

Я уже понял это после некоторых усилий, поэтому я собираюсь ответить на свой вопрос, чтобы документировать его здесь, поскольку решение сразу не возникает при выполнении веб-поиска, а также потому, что это сообщение об ошибке не описывает прямая проблема Докер встречается.

Ответ 1

"Ссылка" в докере - это указатель на изображение. Это может быть имя изображения, идентификатор изображения, включать в него сервер реестра, использовать тег sha256 для привязки изображения и все, что можно использовать для указания изображения, которое вы хотите запустить.

Сообщение об ошибке invalid reference format означает, что докер не может преобразовать строку, которую вы предоставили изображению. Это может быть недопустимое имя, или это может быть из ошибки синтаксического анализа ранее в командной строке docker run если это то, как вы запускаете изображение. Если файл компоновки, если вы расширите переменную в имени изображения, эта переменная может не расширяться правильно.

В командной строке docker run это часто является результатом не цитирования параметров с пробелами и ошибкой порядка командной строки. Командная строка упорядочена как:

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

Наиболее распространенной ошибкой при прохождении args к запуску является отображение томов, расширяющее имя пути, которое включает в себя пробел, а не цитирование пути или экранирование пробела. Например

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

И исправление так же просто, как:

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

Ответ 2

В моем случае проблема заключалась в настройке параметров. Первоначально у меня был параметр --name после параметров среды, а затем параметры volume и attach_dbs и изображение в конце команды, как 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 ниже, все работает нормально (в основном --name параметр --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']}]"

Ответ 3

имел место в текущем рабочем каталоге и usign $(pwd) для отображения томов. Не любит пробелы в именах каталогов.

Ответ 4

В моем случае имя изображения, определенное в docker-compose.yml содержало прописные буквы. Тот факт, что сообщение об ошибке упоминалось в repository вместо image, не помогло описать проблему, и потребовалось некоторое время, чтобы разобраться.

Ответ 5

На MacOS, когда вы работаете на диске iCloud, ваш $ PWD будет содержать каталог "Мобильные документы". Кажется, не нравится пространство!

В качестве обходного пути я скопировал свой проект на локальный диск, на котором нет места в пути к папке с моим проектом.

Я не вижу способа, которым вы можете обойти по умолчанию путь к iCloud, который является ~/Library/Mobile Documents/com~apple~CloudDocs

Кажется, пробел в "Мобильных документах" не подходит для запуска Docker.

Ответ 6

Позвольте мне подчеркнуть, что Docker даже не допускает смешанные символы.

Хорошо: docker build -t myfirstechoimage:0.1.

Плохо: docker build -t myFirstEchoImage:0.1.

Ответ 7

Для меня проблема была с пространством в томе, которое не удалось избежать. Задание jenkins, в котором выполнялась команда запуска docker, содержало пробел, и в результате механизм докера не смог понять команду запуска docker.

Ответ 8

Замена image: ${DOCKER_REGISTRY}notificationsapi с image:notificationsapi или image: ${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

Так что, я думаю, ошибка была вызвана не строчными буквами, которые она имела

Ответ 9

У меня была такая же ошибка, и по какой-то причине она, по-видимому, была причиной заглавными буквами в задании Jenkins, которое выполняло команду docker run.

Ответ 10

Это происходит из-за пробелов в текущем рабочем каталоге, полученных из $(pwd) для томов карты. Так что вместо этого я использовал docker-compose.

Файл docker-compose.yml.

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

Ответ 11

Действительно, реестр 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305 на сегодняшний день (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) не обрабатывает пути, содержащие символы верхнего регистра. Это, очевидно, плохой выбор дизайна, возможно, из-за желания поддерживать совместимость с некоторыми операционными системами, которые не различают регистр на уровне файлов (например, 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

"Docker build -f Dockerfile -t SpringBoot-Docker." Как и в приведенном выше комментарии, мы создаем файл изображения для контейнера Docker. commend говорит, что создайте файл использования изображения (-f относится к файлу докера) и -t для цели файла изображения, который мы собираемся передать в докер. "." представляет текущий каталог

Решение вышеуказанной проблемы: укажите имя целевого изображения в нижнем регистре

Ответ 13

Docker может создавать изображения автоматически, читая инструкции из Dockerfile. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать в командной строке для сборки изображения. пример: ОТ python: 3.7-alpine 'python' должен быть в нижнем регистре

Ответ 14

В моем случае я пытался запустить 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

Ответ 15

иногда вы пропускаете флаг -e, в то время как определенные несколько переменных env встроены

например, плохо: docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename eg postgres>

хорошо: docker run --name somecontainername -e ENV_VAR1=somevalue1 **-e ENV_VAR2=somevalue2** -d -v "mypath:containerpath" <imagename eg postgres>