Ошибка докера: неверный ссылочный формат: имя репозитория должно быть строчным
Выиграл эту ошибку 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>