докер: неверный формат ссылки

105

Я следую этому руководству: https://medium.com/towards-data-science/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c

и они используют докер. Когда я пытался запустить докер (внутри скрипта 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 часа и не очень понимаю, что не так. Любая идея действительно ценится.

ai2016
источник
3
Попробуйте этоdocker run -p 8888:8888 -v "`pwd`/../src":/src -v "`pwd`/../data":/data -w /src --rm -it supervisely_anpr bash
Тарун Лалвани
5
Как упомянули @TarunLalwani и @Oleg, вам нужно переместить --rmи -itмежду ними, runи имя изображения. Однако это не объясняет сообщение об ошибке. Вы проверяли, нет ли у символов имени изображения какой-либо специальной кодировки или верхнего регистра? Копировать и вставить из вашего сниппета работает для меня, а docker run --rm foo! bashвыдает ту же ошибку, что и ваша.
gesellix
3
рассматривает возможность публикации ответа на этот вопрос, чтобы его было легче найти для следующего парня
lloiacono
4
Всегда заключайте расширения в двойные кавычки, если вы действительно не хотите разбивать строку на слова. Здесь используйте "$(pwd)"(современная форма "`pwd`"). Ваша команда делается docker run -p 8888:8888 -v "$(pwd)"/../src:/src -v "$(pwd)"/../data:/data -w /src supervisely_anpr --rm -it bash.
Мартин
1
@gesellix, спасибо. Копирование-вставка команд из руководств не следует делать в первую очередь при изучении нового материала, за исключением того, что это может принести неожиданную боль, когда задействован какой-то подлый испорченный символ. Хорошо, что я увидел ваш комментарий, прежде чем потратить два часа или полдня на такую ​​"ошибку" ^ _ ^
Ден Дробязко

Ответы:

88

В powershell вы должны использовать ${pwd}vs$(pwd)

Левон Петросян
источник
7
Это то, что заставило меня биться головой об стену (иногда я ненавижу M $ FT)
beerwin
docker run --rm -ti --name zalenium -p 4444:4444 -p 5555:5555 \ -e SAUCE_USERNAME -e SAUCE_ACCESS_KEY \ -v /tmp/videos:/home/seluser/videos \ -v /var/run/docker.sock:/var/run/docker.sock \ dosel/zalenium start --sauceLabsEnabled trueчто не так с моей командой? Это также дает ту же ошибку.
Пол
Спасибо вам большое!
Эндрю Бреннан,
45

Первый аргумент после «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://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow-lightning.html#29

BMitch
источник
3
Слайд 30 решил мою проблему. У меня был файл .sh, работающий в Cygwin. Я изменил # !/bin/bash(обратите внимание на пробел между #и !до, #!/bin/bash а затем End of Line Sequenceот CRLFдо LF. Это все, что я сделал. Спасибо @BMitch за то, что поделился слайдами.
blongho
10

У меня была такая же проблема, когда я copy-pastedвыполнял команду. Вместо этого, когда я ввел всю команду, она сработала!

Удачи...

Аакаш
источник
2
Вау, это действительно помогло.
Матяг,
3
Ага, для меня это было --nameвставлено -из-за автоматической смены редактора. Спасибо, что сэкономили мне время.
Рви Панди,
7

У меня была похожая проблема. Проблема, с которой я $(pwd)столкнулся, заключалась в том, что там было место, которое выбрасывало докер.

Измените имя каталога, чтобы в нем не было пробелов, и оно должно работать, если в этом проблема

Яшвиер Косараджу
источник
3

Я столкнулся с этой проблемой, когда у меня не было заданной переменной среды.

docker push ${repo}${image_name}:${tag}

repoи image_nameбыли определены, но tagне были.

Это привело к docker push repo/image_name:.

Который бросил docker: invalid reference format.

брендонбанки
источник
У меня была такая же проблема, и я исправил ее, установив отсутствующую переменную среды export tag = latest
PHZ.fi-Pharazon
1

Обнаружено, что использование docker-compose configсообщило, в чем проблема.

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

user12272112
источник
0

Это также происходит, когда вы используете в рабочей среде 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"
Стивен
источник