Помилка Docker: недійсний формат посилання: назва сховища має бути нижчою


86

Натрапив на цю помилку Docker в одному з моїх проектів:

invalid reference format: repository name must be lowercase

Які різні причини цього загального повідомлення?

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


"посилання" у цьому повідомленні про помилку є ідентифікатором зображення, як пояснив BMitch у своїй відповіді. Отже, формат значення, яким ви вказували на зображення, недійсний. Повне пояснення прочитаного BMitch в: stackoverflow.com/a/52818152/336694
HostedMetrics.com

Відповіді:


78

"Посилання" в Docker - це вказівник на зображення. Це може бути ім’я зображення, ідентифікатор зображення, включати в ім’я сервер реєстру, використовувати тег sha256 для закріплення зображення та будь-що інше, що може бути використано для вказівки на зображення, яке потрібно запустити.

Повідомлення про invalid reference formatпомилку означає, що докер не може перетворити наданий вами рядок на зображення. Це може бути невірним ім’ям або помилкою синтаксичного аналізу раніше в 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

3
"За допомогою командного рядка, який запускає docker, це часто призводить до нецитування параметрів з пробілами та помилки в порядку командного рядка" Це було дуже корисно
user979899

Надзвичайно корисний пост навіть через 2 роки!
Гео

Працював ідеально. Дякую!
Ігор Мелан

24

Дозвольте підкреслити, що Докер не допускає навіть змішаних символів.

Добре: docker build -t myfirstechoimage:0.1 .

Погано: docker build -t myFirstEchoImage:0.1 .


1
Ого, це заощадило багато зусиль!
допитливий

1
Я використовую залежність "spotify" maven у проекті SpringBoot для створення образу докера, і останні пару годин я намагався зрозуміти проблему. Назва проекту (містить великі символи) виявиться проблемою!
Абхішек Аггарвал

15

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


2
Це вирішило це для мене! Я загорнув $(pwd)у лапки, і це спрацювало.
MerseyViking

14

У моєму випадку це були -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

Також перевірте, чи немає пробілів


5
Те саме зі мною, мені не вистачало -eоднієї зі змінних мого середовища.
Ерік Бішард,

у моєму випадку я забув експортувати змінну із зовнішнього середовища.
Пшемек

8

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


1
Ще однією поширеною причиною, яку виявили під час пошуку в Інтернеті, було те, що люди мають пробіли в назвах каталогів під час монтажу томів.
HostedMetrics.com

Це сталося зі мною з іншої причини. Багатоступенева побудова докера всередині файлу Docker, названого верхніми літерами. Приклад: FROM bla:bla AS BUILDне вдалося. FROM bla:bla AS buildбуло добре Thx!
Андерсон Маркес,

8

У моєму випадку проблема полягала в розташуванні параметрів. Спочатку у мене був --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']}]"

4

У MacOS, коли ви працюєте на диску iCloud, ваш $ PWD міститиме каталог "Мобільні документи". Здається, не подобається простір!

Як обхідний шлях я скопіював свій проект на локальний диск, де немає місця на шляху до папки мого проекту.

Я не бачу способу, яким можна обійтись, змінивши стандартний шлях до iCloud, який є ~/Library/Mobile Documents/com~apple~CloudDocs

Здається, простір у шляху в "Мобільних документах" не подобається запуску докера.


1
Замість копіювання проекту ви можете уникнути простору, наприклад Mobile\ Documents
efru

1

Заміна image: ${DOCKER_REGISTRY}notificationsapi з image:notificationsapi або image: ${docker_registry}notificationsapi в Докер-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

Тому я думаю, що помилка була пов’язана з не малими літерами, які вона мала


1

Для мене проблема полягала в просторі в картографічному обсязі, якому не вдалося уникнути. У завданні jenkins, яке виконувало команду запуску докера, було пробіл, і в результаті механізм докера не зміг зрозуміти команду запуску докера.


1

Дійсно, на сьогоднішній день реєстр докерів (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

1

іноді ви пропускаєте прапорець -e, коли певні декілька env змінюються в рядку

напр. погано: 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>


1

A referenceв Docker - це те, що вказує на зображення. Це може бути у віддаленому реєстрі або локальному реєстрі. Спершу я опишу повідомлення про помилку, а потім покажу рішення для цього.

недійсний формат посилання

Це означає, що посилання, яке ми використовували, не є допустимим форматом. Це означає, що посилання (вказівник), яке ми використовували для ідентифікації зображення, є недійсним. Як правило, після цього йде наступний опис. Це зробить помилку набагато зрозумілішою.

недійсний формат посилання: ім'я сховища має бути в нижньому регістрі

Це означає, що посилання, яке ми використовуємо, не повинно мати великих літер. Спробуйте запустити docker run Ubuntu( неправильно ) проти docker run ubuntu( правильно ). Docker не дозволяє використовувати символи великих літер як посилання на зображення. Прості кроки з усунення несправностей.

1) Dockerfile містить великі літери як зображення.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Назва зображення, визначена в docker-compose.yml, мала великі літери

3) Якщо ви використовуєте Jenkins або GoCD для розгортання контейнера докера, перевірте команду запуску, чи містить назва зображення велику літеру.

Будь ласка, прочитайте цей документ, написаний спеціально для цієї помилки.


0

У мене була та сама помилка, і чомусь, здається, причиною були великі літери в завданні Дженкінса, яке виконувало docker runкоманду.


0

Це відбувається через пробіли в поточному робочому каталозі, які надходили $(pwd)для томів карти. Отже, я використовувавdocker-compose замість цього.

docker-compose.ymlФайл.

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

0

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

рішення вищезазначеної проблеми: вкажіть назву цільового зображення в нижньому регістрі


0

Docker може автоматично створювати зображення, читаючи інструкції з файлу Docker. Файл Docker - це текстовий документ, який містить усі команди, які користувач може викликати в командному рядку для складання зображення. приклад: ВІД python: 3.7-alpine 'Пітон' повинен бути в нижньому регістрі


0

У моєму випадку я намагався запустити 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


0

Я бажаю, щоб повідомлення про помилку виводило рядок проблеми. Я отримав це через дивну проблему копіювання та вставлення команди "docker run". Прогалини , як символ використовувалися перед ім'ям зворотного РЕПО і зображень.


0

Більшість наведених вище відповідей не працювали в моєму випадку, тому я зафіксую це на випадок, якщо хтось вважатиме це корисним. Перший рядок у файлі docker FROM node:10для мого випадку, вузол слова не повинен бути великим, тобто FROM NODE:10. Я вніс цю зміну, і вона спрацювала.


0

У моєму випадку DockerFile містив назву зображення у змішаному регістрі замість нижнього регістру.

Раніше рядок у моєму DockerFile

FROM CentOs

і коли я змінив вище на FROM centos, це працювало безперебійно.


0

У моєму випадку у мене був відкритий --envперемикач, тобто такий, що не має фактичного імені або значення змінної, наприклад:

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

-2

Спробуйте використовувати символи нижнього регістру у файлі DockerFile

Наприклад, використовуйте:

openjdk:8

замість

openJDK:8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.