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


104

Я дотримуюсь цього підручника: 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 години і не можу насправді зрозуміти, що не так. Будь-яка ідея справді оцінена.


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

Перший аргумент після "запуску", який не є прапором або параметром прапора, аналізується як ім'я зображення. Коли розбір не вдається, він повідомляє, що посилальний формат, який називається іменем зображення (але може бути ідентифікатором зображення, закріпленим зображенням або іншим синтаксисом), недійсний. У вашій команді:

 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


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.


У мене була та ж проблема, і я її виправив, встановивши відсутність змінної середовища тегу експорту = останній
PHZ.fi-Pharazon

1

Встановив, що за допомогою docker-compose configповідомляється, в чому проблема.

У моєму випадку файл перевизначення складання із записом, який нічого не перекривав .


0

Це також трапляється, коли ви використовуєте розробницький докер, як показано нижче, у виробництві. Ви не хочете створювати образи у виробництві, оскільки це порушує ідеологію контейнерів. Нам слід розгорнути зображення:

  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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.