Napotkałem ten błąd Dockera w jednym z moich projektów:
invalid reference format: repository name must be lowercase
Jakie są różne przyczyny tej ogólnej wiadomości?
Po pewnym wysiłku już to rozgryzłem, więc odpowiem na własne pytanie, aby to udokumentować, ponieważ rozwiązanie nie pojawia się od razu podczas wyszukiwania w Internecie, a także dlatego, że ten komunikat o błędzie nie opisuje bezpośredni problem, na jaki napotyka Docker.
docker
docker-compose
HostedMetrics.com
źródło
źródło
Odpowiedzi:
„Odwołanie” w oknie dokowanym to wskaźnik do obrazu. Może to być nazwa obrazu, identyfikator obrazu, uwzględnienie serwera rejestru w nazwie, użycie znacznika sha256 do przypięcia obrazu i wszystko inne, co może być użyte do wskazania obrazu, który chcesz uruchomić.
Komunikat o
invalid reference format
błędzie oznacza, że docker nie może przekonwertować podanego ciągu na obraz. Może to być nieprawidłowa nazwa lub może wynikać z błędu analizowania wcześniejszego wdocker run
wierszu poleceń, jeśli w ten sposób uruchamiasz obraz. W przypadku pliku redagowania, jeśli rozwiniesz zmienną w nazwie obrazu, ta zmienna może nie rozwijać się poprawnie.W przypadku
docker run
wiersza poleceń często skutkuje to brakiem cytowania parametrów ze spacjami i błędną kolejnością wiersza poleceń. Linia poleceń jest uporządkowana jako:Najczęstszym błędem w przekazywaniu argumentów do uruchomienia jest mapowanie woluminu rozszerzające nazwę ścieżki, która zawiera spację, a nie cytowanie ścieżki ani jej unikanie. Na przykład
Rozwiązanie jest tak proste, jak:
źródło
Podkreślę, że Docker nie pozwala nawet na mieszane postacie.
Dobry:
docker build -t myfirstechoimage:0.1 .
Zły:
docker build -t myFirstEchoImage:0.1 .
źródło
miał miejsce w bieżącym katalogu roboczym i służył
$(pwd)
do mapowania woluminów. Nie lubi spacji w nazwach katalogów.źródło
$(pwd)
w cudzysłów i zadziałało.W moim przypadku było
-e
wcześniej parametry dokera mysqlSprawdź również, czy brakuje spacji
źródło
-e
poprzedniej jednej z moich zmiennych środowiskowych.W moim przypadku nazwa obrazu jest zdefiniowana za pomocą
docker-compose.yml
wielkich liter. Fakt, że komunikat o błędzie wymienionychrepository
zamiastimage
nie pomogło opisać problem i zajęło to trochę czasu, aby dowiedzieć się.źródło
FROM bla:bla AS BUILD
niepowodzenie.FROM bla:bla AS build
było OK dzięki!W moim przypadku problem polegał na ustawieniu parametrów. Początkowo miałem
--name
parametr po parametrach środowiska, a następnie głośność iattach_dbs
parametry oraz obraz na końcu polecenia, jak poniżej.Po przestawieniu parametrów jak poniżej wszystko działało dobrze (w zasadzie wstawienie
--name
parametru, a następnie nazwa obrazu).źródło
Na MacOS, kiedy pracujesz na dysku iCloud, twój $ PWD będzie zawierał katalog „Dokumenty mobilne”. Wygląda na to, że przestrzeń nie lubi!
Aby obejść ten problem, skopiowałem swój projekt na dysk lokalny, na którym nie ma miejsca w ścieżce do mojego folderu projektu.
Nie widzę sposobu na obejście zmiany domyślnej ścieżki do iCloud, którą jest
~/Library/Mobile Documents/com~apple~CloudDocs
Przestrzeń na ścieżce w „Dokumentach mobilnych” wydaje się być tym, czego nie lubi docker.
źródło
Mobile\ Documents
Wymiana
image: ${DOCKER_REGISTRY}notificationsapi
zimage:notificationsapi
lubimage: ${docker_registry}notificationsapi
w Docker-compose.yml nie rozwiązuje problemuplik z błędem
plik bez błędów
Myślę więc, że błąd wynikał z braku małych liter
źródło
Dla mnie problem polegał na tym, że miejsce w mapowaniu woluminów nie zostało usunięte. Zadanie Jenkinsa, które uruchamiało polecenie docker run, miało w sobie spację, w wyniku czego silnik dockera nie był w stanie zrozumieć polecenia docker run.
źródło
Rzeczywiście, dzisiejszy rejestr Dockera (sha
2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
) nie obsługuje ścieżek zawierających wielkie litery. Jest to oczywiście zły wybór projektowy, prawdopodobnie ze względu na chęć zachowania zgodności z niektórymi systemami operacyjnymi, które nie rozróżniają wielkości liter na poziomie plików (np. Windows ).Jeśli ktoś uwierzytelnia się dla zakresu i próbuje pobrać nieistniejące repozytorium ze wszystkimi małymi literami, dane wyjściowe to
Jeśli jednak spróbuje się to zrobić ze składnikiem pisanym wielkimi literami, zwracany jest tylko 404:
źródło
czasami pomijasz flagę -e, gdy w tekście znajduje się kilka zmiennych env
np. zły:
docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>
dobry:
docker run --name somecontainername -e ENV_VAR1=somevalue1 -e ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>
źródło
A
reference
w Dockerze wskazuje na obraz. Może to być rejestr zdalny lub rejestr lokalny. Pozwól, że najpierw opiszę komunikat o błędzie, a następnie pokażę rozwiązania tego problemu.Oznacza to, że odwołanie, którego użyliśmy, nie jest prawidłowym formatem. Oznacza to, że odniesienie (wskaźnik), którego użyliśmy do identyfikacji obrazu, jest nieprawidłowe. Na ogół następuje następujący opis. Dzięki temu błąd będzie znacznie wyraźniejszy.
Oznacza to, że odwołanie, którego używamy, nie powinno mieć wielkich liter. Spróbuj uruchomić
docker run Ubuntu
( źle ) vsdocker run ubuntu
( poprawnie ). Docker nie zezwala na żadne wielkie litery jako odniesienia do obrazu. Proste kroki rozwiązywania problemów.1) Dockerfile zawiera wielkie litery jako obrazy.
2) Nazwa obrazu zdefiniowana w docker-compose.yml miała wielkie litery
3) Jeśli używasz Jenkinsa lub GoCD do wdrażania kontenera Docker, sprawdź polecenie uruchomienia, czy nazwa obrazu zawiera wielką literę.
Przeczytaj ten dokument napisany specjalnie dla tego błędu.
źródło
Miałem ten sam błąd iz jakiegoś powodu wydaje się, że był on spowodowany dużymi literami w zadaniu Jenkinsa, które uruchomiło
docker run
polecenie.źródło
Dzieje się tak z powodu spacji w bieżącym katalogu roboczym, które pochodzą z
$(pwd)
woluminów map. Więcdocker-compose
zamiast tego użyłem .docker-compose.yml
Plików.źródło
„Docker build -f Dockerfile -t SpringBoot-Docker”. Jak w powyższym poleceniu tworzymy plik obrazu dla kontenera docker. commend mówi, że utwórz plik użycia obrazu ( -f odnosi się do pliku dockera ) i -t dla celu pliku obrazu, który zamierzamy wypchnąć do dockera. „.” reprezentuje bieżący katalog
rozwiązanie powyższego problemu: podaj nazwę obrazu docelowego małymi literami
źródło
Docker może automatycznie tworzyć obrazy, odczytując instrukcje z pliku Dockerfile. Plik Dockerfile to dokument tekstowy zawierający wszystkie polecenia, które użytkownik może wywołać w wierszu poleceń, aby złożyć obraz. przykład: FROM python: 3.7-alpine Słowo „python” powinno być zapisane małymi literami
źródło
W moim przypadku próbowałem uruchomić postgres przez docker. Początkowo biegałem jako:
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
Brakowało mi -e po każdej zmiennej środowiskowej. Zmiana powyższego polecenia na poniższe zadziałała
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
źródło
Chciałbym, aby komunikat o błędzie wyświetlał ciąg problemu. Otrzymywałem to z powodu dziwnego problemu z kopiowaniem i wklejaniem w poleceniu „docker run”. Czasoprzestrzeni jak znak był używany przed nazwą repo i obrazu.
źródło
Większość powyższych odpowiedzi nie zadziałała w moim przypadku, więc udokumentuję to na wypadek, gdyby ktoś uznał to za pomocne. Pierwsza linia w pliku dockerfile
FROM node:10
dla mojego przypadku, słowo node nie powinno być wielkie, tjFROM NODE:10
. Dokonałem tej zmiany i zadziałało.źródło
W moim przypadku DockerFile zawierał nazwę obrazu w mieszanej wielkości zamiast małych liter.
Wcześniejszy wiersz w moim pliku DockerFile
a kiedy zmieniłem powyżej
FROM centos
, działało gładko.źródło
W moim przypadku miałem nagi
--env
przełącznik, czyli taki bez rzeczywistej nazwy lub wartości zmiennej, np .:źródło
Spróbuj użyć małych liter w swoim pliku DockerFile
Na przykład użyj:
zamiast
źródło