Докер: неверный формат ссылки
Я следую этому руководству: https://medium.com/towards-data-science/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c
и они используют докер. Когда я попытался запустить Docker (внутри скрипта run.sh):
docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
Я получил ошибку:
docker: invalid reference format.
Я провел 2 часа, и я не могу понять, что не так. Любая идея действительно ценится.
30 ответов
У меня была такая же проблема, когда я copy-pasted
команда. Вместо этого, когда я ввел всю команду, она сработала!
Удачи...
Первый аргумент после "run", который не является флагом или параметром для флага, анализируется как имя изображения. Когда этот синтаксический анализ завершается неудачно, он сообщает вам, что ссылочный формат, то есть имя изображения (но может быть идентификатором изображения, закрепленным изображением или другим синтаксисом), недопустим. В вашей команде:
docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
Имя изображения "supervisely_anpr" является допустимым, поэтому вам нужно посмотреть ранее в команде. В этом случае ошибка скорее всего из pwd
вывод пути с пробелом в нем. Все после пробела больше не является параметром -v
и докер пытается разобрать его как имя изображения. Исправление заключается в том, чтобы заключить в кавычки параметры объема, когда вы не можете гарантировать, что в нем нет пробелов или других специальных символов.
Когда вы сделаете это, вы столкнетесь со следующей ошибкой "Исполняемый файл не найден". Все после имени изображения анализируется как команда для запуска внутри контейнера. В вашем случае он попытается запустить команду --rm -it bash
который почти наверняка потерпит неудачу, так как --rm
не будет существовать в виде двоичного файла внутри вашего изображения. Вам нужно изменить порядок параметров, чтобы решить это:
docker run --rm -it -p 8888:8888 -v "`pwd`/../src:/src" -v "`pwd`/../data:/data" -w /src supervisely_anpr bash
У меня есть некоторые подробности об этих двух ошибках и причинах в моих слайдах здесь: https://rawgit.com/sudo-bmitch/dc2018/master/faq-stackru-lightning.html
Я столкнулся с этой проблемой, когда у меня не было заданной переменной среды.
docker push ${repo}${image_name}:${tag}
repo
а также image_name
были определены, но tag
не было.
Это привело к docker push repo/image_name:
.
Который бросил docker: invalid reference format.
У меня была похожая проблема. У меня была проблема $(pwd)
там есть место, где разбрасывался докер.
Измените имя каталога, чтобы в нем не было пробелов, и оно должно работать, если это проблема
У меня были проблемы с Linux. Это было из-за того, что имена каталогов содержали пробелы. Я исправил это с помощью
"$(pwd)/path/to/go"
вместо
$(pwd)/path/to/go
Другие приходят сюда:
если вы помещаете команду docker в файл, скажите
run.sh
, проверьте свой разделитель строк. В Linux это должно бытьLR
, иначе вы получите ту же ошибку.
Я выполнял всю команду в одной строке, как это было упомянуто как таковое
$ docker run --name testproject-agent \
-e TP_API_KEY="REPLACE_WITH_YOUR_KEY" \
-e TP_AGENT_ALIAS="My First Agent" \
testproject/agent:latest
Но это должна была быть многострочная команда, и я скопировал командную строку за строкой и нажал
enter
после каждой строчки и бац! это сработало.
Иногда, когда вы копируете из Интернета,
new-line
символ опускается, поэтому я предлагаю попробовать вручную ввести новую строку.
В моем случае команда была такой
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kongpass" \
postgres:9.6
Я пытался скопировать все в одну строку, включая косую черту (\), и получил следующую ошибку.
docker: invalid reference format.
Косая черта (\) в команде указывает на следующую строку, поэтому, если вы пытаетесь выполнить всю команду в одной строке, просто удалите косую черту (\), у меня это сработало.
Спасибо :)
Иногда проблема заключается в дополнительном пробеле в конце строки.
Плохой:
-v "$(pwd)/../src:/src" \
Пробелы в конце!
Хороший:
-v "$(pwd)/../src:/src" \
Только новая строка после косой черты!
Дополнительный совет: некоторые редакторы (например, VSCode) придают другой цвет косой черте, за которой следует пробел.
В моем случае, когда я создал образ докера,
Я использовал очень общую команду
docker build .
Из-за чего у моего изображения нет имени. И оказалось, что мне нужно было просто указать имя тега
docker build . -t image_name
И тогда это сработало.
Обнаружил, что с помощью docker-compose config
сообщил, в чем проблема.
В моем случае это переопределенный файл компоновки с записью, которая ничего не переопределяла.
В моем случае причиной были невидимые символы после копирования/вставки из Notes. Замена их на пробелы помогла
Это также происходит, когда вы используете в рабочей среде docker compose, как показано ниже. Вы не хотите создавать изображения в производственной среде, поскольку это ломает идеологию контейнеров. Мы должны развертывать образы:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
Измените это, чтобы использовать созданный образ:
web:
command: /bin/bash run.sh
image: registry.voxcloud.co.za:9000/dyndns_api_web:0.1
ports:
- "8000:8000"
Я удалил
()
и работал у меня вот так
docker run -d -v $pwd/envoy.yaml:/etc/envoy/envoy.yaml:ro -p 8080:8080 -p 9901:9901
Я использую windows 10
У меня возникла та же проблема при использовании $ (pwd) через powershell, я заменил ее на $ {pwd}, и у меня это сработало.
Ниже приведены подробности того же самого:
PS C:\Users\Systems\git\mastery\dockerfile> docker container run -d --name nginx -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx
docker: invalid reference format.
See 'docker run --help'.
PS C:\Users\Systems\git\mastery\dockerfile> docker container run -d --name nginx -p 8080:80 -v ${pwd}:/usr/share/nginx/html nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
Digest: sha256:25975292693bcc062becc20a1608936927f9950a42fb4474088f6292dacd4ec9
Status: Downloaded newer image for nginx:latest
f6ff08ed3b73095e85474bd2f248a7cae6b5bcdb53e12e4824d235df3cd268aa
В моем случае проблема заключается в полном пути к папке с репо, где я использую терминал и докер. У меня было что-то вроде этого:
repo (1)/repo/
так что переименуйте папку в
repo/repo
и это поможет
Удалить\
и просто постоянно пишите свою команду.
Напишите это так
docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash
вместо
docker run \
-p 8888:8888
-v `pwd`/../src:/src \
-v `pwd`/../data:/data -w /src supervisely_anpr \
--rm \
-it \
bash
У меня такая же проблема. Я пытался написать bash-скрипт для запуска моего док-контейнера на удаленном сервере, но столкнулся с той же ошибкой docker: invalid reference format.
old-start-container.sh
#!/bin/bash
docker run -p 80:5000 'dockerrepo/imagename:tag'
Вот как я это исправил. Я использовал подстановку команд bash, чтобы заставить команду docker работать правильно.
new-start-container.sh
#!/bin/bash
$(docker run -p 80:5000 'dockerrepo/imagename:tag')
У меня был сценарий, когда программа заметок заменила--
() с—
(0x2014
). Когда я заметил неверный переключатель, я набрал дополнительный, но в итоге получил—-
(0x20140x2D
) и не0x2D0x2D
В моем случае проблема заключалась в пустом месте после '\'. Скопируйте и вставьте всю команду в редактор, настроенный для отображения скрытых символов (VSCode, Notepad++, sublime), и выберите тип файла, который будет отображаться.bash
редактор покажет неправильный '\'
Sublime показывает дополнительное пространство и неправильную обратную косую черту
Просто предупреждение: если в какой-либо папке вашего пути есть пробел, удалите ее. Например, если одно из имен папкиmy folder
, измените его наmy-folder
.
Итак, в моем случае проблема заключалась в том, что команда была «незаконной». в формате, который не поддерживался, что было последним, что я ожидал, так как я нашел его в официальной документации, но это то, что есть. Убедитесь, что вы используете правильную команду.
Если вы запускаете скрипт в Windows PowerShell , вам нужно заменить $(pwd) на ${pwd} с фигурными скобками.
docker run -p ${C_PORT}:22 --name ${CONTAINER_NAME} ${IMAGE_ID} /bin/bash
Либо CONTAINER_NAME, либо IMAGE_ID должны быть подтверждены. Или запустите с помощью sudo.
Запустите его в CMD вместо PowerShell, если вы используете Windows.
Одна из проблем, с которыми я столкнулся, заключалась в том, что в моих конфигах
skaffold config list -a
, мой репозиторий по умолчанию был установлен на
https://docker-registry.url.com
как показано ниже:
kubeContexts:
- kube-context: minikube
default-repo: https://docker-registry.url.com
но вместо этого правильный путь должен был быть без
https://
:
kubeContexts:
- kube-context: minikube
default-repo: docker-registry.url.com
На случай, если кто-то еще попадет в нее, еще один вариант, который приводит к этой ошибке, вызван конечным / или \ в вашей спецификации пути.
то есть
-v c:\mystuff:c:\mappedfolder
работает
но:
-v c:\mystuff\:c:\mappedfolder
не
Где есть доп.
"\"
в конце
mystuff
Другой случай, когда это может проявиться, — это когда вам не хватает образа для запуска.