docker: nieprawidłowy format odniesienia

111

Śledzę ten samouczek: https://medium.com/towards-data-science/number-plate-detection-with-supervisely-and-tensorflow-part-1-e84c74d4382c

i używają dockera. Kiedy próbowałem uruchomić dockera (wewnątrz skryptu run.sh):

docker run \
    -p 8888:8888 
    -v `pwd`/../src:/src \
    -v `pwd`/../data:/data -w /src supervisely_anpr \
    --rm \
    -it \
    bash

Wyskoczył mi błąd:

docker: invalid reference format.

Spędziłem 2 godziny i naprawdę nie rozumiem, co jest nie tak. Każdy pomysł naprawdę doceniony.

ai2016
źródło
3
Spróbuj tegodocker run -p 8888:8888 -v "`pwd`/../src":/src -v "`pwd`/../data":/data -w /src --rm -it supervisely_anpr bash
Tarun Lalwani
5
Jak @TarunLalwani i @Oleg wymienić trzeba przesunąć --rmi -itw międzyczasie runi nazwę obrazu. To jednak nie wyjaśnia komunikatu o błędzie. Czy sprawdziłeś, czy znaki nazwy obrazu nie mają żadnego specjalnego kodowania ani wielkich liter? Kopiuj i wklej z twojego fragmentu kodu działa dla mnie, a docker run --rm foo! bashdrukuje ten sam błąd, co twój.
gesellix
3
rozważanie opublikowania odpowiedzi na to pytanie, aby łatwiej było znaleźć ją następnemu facetowi
lloiacono
4
Rozszerzenia dolarowe zawsze umieszczaj w podwójnych cudzysłowach, chyba że naprawdę chcesz podzielić ciąg na słowa. Tutaj użyj "$(pwd)"(nowoczesna forma "`pwd`"). Twoje polecenie staje się docker run -p 8888:8888 -v "$(pwd)"/../src:/src -v "$(pwd)"/../data:/data -w /src supervisely_anpr --rm -it bash.
Martin Jambon
1
@gesellix dziękuję. Kopiowanie i wklejanie poleceń z podręczników nie powinno być wykonywane w pierwszej kolejności podczas uczenia się nowych rzeczy, poza tym, że może to przynieść nieoczekiwany ból, gdy w grę wchodzi jakiś podstępnie uszkodzony symbol. Dobrze, że widziałem Twój komentarz, zanim spędziłem dwie godziny lub pół dnia na takim „błędzie” ^ _ ^
Den Drobiazko,

Odpowiedzi:

94

W PowerShell powinieneś używać ${pwd}vs$(pwd)

Levon Petrosyan
źródło
7
To właśnie spowodowało, że
uderzyłem
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 trueco jest nie tak z moim poleceniem? Daje również ten sam błąd.
paul
Dziękuję bardzo!
Andrew Brennan
... i po prostu $pwdnie działa, co jest oczywiste.
Timo
48

Pierwszy argument po „uruchomieniu”, który nie jest flagą ani parametrem flagi, jest analizowany jako nazwa obrazu. Gdy ta analiza nie powiedzie się, informuje, że format odniesienia, czyli nazwa obrazu (ale może to być identyfikator obrazu, przypięty obraz lub inna składnia) jest nieprawidłowy. Na Twoje polecenie:

 docker run -p 8888:8888 -v `pwd`/../src:/src -v `pwd`/../data:/data -w /src supervisely_anpr --rm -it bash

Nazwa obrazu „supervisely_anpr” jest prawidłowa, więc należy spojrzeć wcześniej w poleceniu. W tym przypadku błąd najprawdopodobniej wynika z pwdwyprowadzenia ścieżki ze spacją. Wszystko, co znajduje się za spacją, nie jest już parametrem, -va docker próbuje przeanalizować go jako nazwę obrazu. Rozwiązaniem jest cytowanie parametrów woluminu, gdy nie można zagwarantować, że jest on wolny od spacji lub innych znaków specjalnych.

Gdy to zrobisz, napotkasz następny błąd „Nie znaleziono pliku wykonywalnego”. Wszystko po nazwie obrazu jest analizowane jako polecenie do uruchomienia wewnątrz kontenera. W twoim przypadku spróbuje uruchomić polecenie, --rm -it bashktóre prawie na pewno się nie powiedzie, ponieważ nie --rmbędzie istnieć jako plik binarny w twoim obrazie. Musisz zmienić kolejność parametrów, aby rozwiązać ten problem:

 docker run --rm -it -p 8888:8888 -v "`pwd`/../src:/src" -v "`pwd`/../data:/data" -w /src supervisely_anpr  bash

Mam więcej szczegółów na temat tych dwóch błędów i przyczyn na moich slajdach tutaj: https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow-lightning.html#29

BMitch
źródło
3
Slajd 30 rozwiązał mój problem. Miałem plik .sh uruchomiony w Cygwin. Zmieniłem się # !/bin/bash(zwróć uwagę na odstęp między #i !do, #!/bin/bash a potem End of Line Sequenceod CRLFdo LF. To wszystko, co zrobiłem. Dzięki @BMitch za udostępnienie slajdów.
blongho
16

Miałem ten sam problem, kiedy wydałem copy-pastedpolecenie. Zamiast tego, kiedy wpisałem całe polecenie, zadziałało!

Powodzenia...

Aakash
źródło
4
Wow, to faktycznie pomogło.
Matjag
5
Tak, dla mnie został --namewklejony z -powodu automatycznej zmiany edytora. Dzięki, zaoszczędziłeś mi czasu.
Rvy Pandey
8

Miałem podobny problem. Problem, $(pwd)który miałem, dotyczył miejsca, w którym wyrzucał spływ dokera.

Zmień nazwę katalogu tak, aby nie zawierała spacji i powinno działać, jeśli na tym polega problem

yashvier kosaraju
źródło
4

Napotkałem ten problem, gdy nie miałem zestawu zmiennych środowiskowych.

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

repoi image_namezostały zdefiniowane, aletag nie zostały.

Spowodowało to docker push repo/image_name: .

Który wyrzucił docker: invalid reference format.

brandonbanks
źródło
Miałem ten sam problem i naprawiłem go, ustawiając brakujący tag eksportu zmiennej środowiskowej = najnowszy
PHZ.fi-Pharazon
docker buildnie udało mi się z tym błędem FROM ${ORG}/ci-common:${CI_COMMON_VERSION} as builder. Okazało się, że jest to spowodowane prostą literówką w poprzednim ARG CI_COMMON_VERION=2(brakującym S), którą skopiowałem z innego skryptu, który miał wszędzie tę literówkę i dlatego działał dobrze.
CodeManX
1

Okazało się, że użycie docker-compose configzgłosiło problem.

W moim przypadku nadpisany plik redagowania z wpisem, który niczego nie przesłaniał .

user12272112
źródło
0

Dzieje się tak również, gdy używasz w środowisku produkcyjnym programowania docker compose, takiego jak poniżej. Nie chcesz tworzyć obrazów w produkcji, ponieważ to łamie ideologię kontenerów. Powinniśmy wdrażać obrazy:

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"

Zmień to, aby użyć zbudowanego obrazu:

  web:
    command: /bin/bash run.sh
    image: registry.voxcloud.co.za:9000/dyndns_api_web:0.1
    ports:
      - "8000:8000"
Stephen
źródło