내 프로젝트 중 하나에서이 Docker 오류가 발생했습니다.
invalid reference format: repository name must be lowercase
이 일반 메시지의 다양한 원인은 무엇입니까?
나는 이미 약간의 노력 끝에 그것을 알아 냈기 때문에 웹 검색을 할 때 해결책이 즉시 나타나지 않고이 오류 메시지가 설명하지 않기 때문에 여기에 문서화하기 위해 내 질문에 답할 것입니다. Docker가 직면하는 직접적인 문제.
내 프로젝트 중 하나에서이 Docker 오류가 발생했습니다.
invalid reference format: repository name must be lowercase
이 일반 메시지의 다양한 원인은 무엇입니까?
나는 이미 약간의 노력 끝에 그것을 알아 냈기 때문에 웹 검색을 할 때 해결책이 즉시 나타나지 않고이 오류 메시지가 설명하지 않기 때문에 여기에 문서화하기 위해 내 질문에 답할 것입니다. Docker가 직면하는 직접적인 문제.
답변:
docker의 "참조"는 이미지에 대한 포인터입니다. 이미지 이름, 이미지 ID, 이름에 레지스트리 서버 포함, sha256 태그를 사용하여 이미지 고정 및 실행하려는 이미지를 가리키는 데 사용할 수있는 기타 모든 것일 수 있습니다.
invalid reference format
오류 메시지 수단 고정 표시기는 이미지에 제공 한 문자열을 변환 할 수 없습니다. 이것은 잘못된 이름이거나 docker run
이미지를 실행하는 방법 인 경우 명령 줄 앞부분의 구문 분석 오류로 인한 것일 수 있습니다 . compose 파일에서 이미지 이름의 변수를 확장하면 해당 변수가 올바르게 확장되지 않을 수 있습니다.
docker run
명령 줄을 사용하면 매개 변수를 공백으로 인용하지 않고 명령 줄의 순서를 잘못 인식하는 경우가 많습니다. 명령 줄은 다음과 같이 정렬됩니다.
docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_to_exec}
args를 실행에 전달할 때 가장 일반적인 오류는 경로를 인용하거나 공백을 이스케이프하지 않고 공백을 포함하는 경로 이름을 확장하는 볼륨 매핑입니다. 예
docker run -v $(pwd):/data image_ref
그리고 수정은 다음과 같이 쉽습니다.
docker run -v "$(pwd):/data" image_ref
Docker는 혼합 문자도 허용하지 않는다는 점을 강조하겠습니다 .
좋은:
docker build -t myfirstechoimage:0.1 .
나쁜:
docker build -t myFirstEchoImage:0.1 .
제 경우에는 -e
mysql docker의 매개 변수 이전 이었습니다.
docker run --name mysql-standalone -e MYSQL_ROOT_PASSWORD=hello -e MYSQL_DATABASE=hello -e MYSQL_USER=hello -e MYSQL_PASSWORD=hello -d mysql:5.6
누락 된 공백이 있는지도 확인하십시오.
-e
환경 변수 중 하나 가 누락되었습니다 .
현재 작업 디렉토리에 공간이 있고 $(pwd)
볼륨을 매핑하는 데 사용됩니다. 디렉토리 이름의 공백을 좋아하지 않습니다.
$(pwd)
따옴표로 싸서 작동했습니다.
제 경우에는 이미지 이름에 docker-compose.yml
대문자 가 포함되어 있습니다. repository
대신 언급 된 오류 메시지 image
가 문제를 설명하는 데 도움이되지 않았고 파악하는 데 시간이 걸렸습니다.
FROM bla:bla AS BUILD
실패. FROM bla:bla AS build
괜찮 았습니다 Thx!
제 경우에는 매개 변수 배열에 문제가있었습니다. 처음에는 --name
환경 매개 변수 다음에 매개 변수가 있고 볼륨과 attach_dbs
매개 변수가 있고 명령 끝에 다음과 같은 이미지가 있습니다.
docker run -p 1433:1433 -e sa_password=myComplexPwd -e ACCEPT_EULA=Y --name sql1 -v c:/temp/:c:/temp/ attach_dbs="[{'dbName':'TestDb','dbFiles':['c:\\temp\\TestDb.mdf','c:\\temp\\TestDb_log.ldf']}]" -d microsoft/mssql-server-windows-express
아래와 같이 매개 변수를 다시 정렬하면 모든 것이 잘 작동했습니다 (기본적으로 --name
매개 변수 뒤에 이미지 이름을 넣음 ).
docker run -d -p 1433:1433 -e sa_password=myComplexPwd -e ACCEPT_EULA=Y --name sql1 microsoft/mssql-server-windows-express -v C:/temp/:C:/temp/ attach_dbs="[{'dbName':'TestDb','dbFiles':['C:\\temp\\TestDb.mdf','C:\\temp\\TestDb_log.ldf']}]"
MacOS에서 iCloud 드라이브로 작업 할 때 $ PWD에는 "Mobile Documents"디렉토리가 포함됩니다. 공간이 마음에 들지 않는 것 같습니다!
해결 방법으로 내 프로젝트 폴더 경로에 공간이없는 로컬 드라이브에 프로젝트를 복사했습니다.
나는 당신이 iCloud의 기본 경로를 changnig 돌아 다니는 방법을 보지 못합니다. ~/Library/Mobile Documents/com~apple~CloudDocs
"Mobile Documents"의 경로에있는 공간은 docker run이 좋아하지 않는 것 같습니다.
Mobile\ Documents
docker-compose.yml image: ${DOCKER_REGISTRY}notificationsapi
로 image:notificationsapi
또는 대체 image: ${docker_registry}notificationsapi
하면 문제가 해결되었습니다.
오류가있는 파일
version: '3.4'
services:
notifications.api:
image: ${DOCKER_REGISTRY}notificationsapi
build:
context: .
dockerfile: ../Notifications.Api/Dockerfile
오류없이 파일
version: '3.4'
services:
notifications.api:
image: ${docker_registry}notificationsapi
build:
context: .
dockerfile: ../Notifications.Api/Dockerfile
그래서 오류가 소문자가 아닌 것 때문이라고 생각합니다.
실제로 오늘날의 docker 레지스트리 (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
)는 대문자가 포함 된 경로를 처리하지 않습니다. 이것은 분명히 잘못된 디자인 선택입니다. 아마도 파일 수준에서 대소 문자를 구분하지 않는 특정 운영 체제 (예 : windows ) 와의 호환성을 유지하기를 원하기 때문일 것입니다 .
범위에 대해 인증하고 모두 소문자로 존재하지 않는 저장소를 가져 오려고하면 출력은 다음과 같습니다.
(auth step not shown)
curl -s -H "Authorization: Bearer $TOKEN" -X GET https://$LOCALREGISTRY/v2/test/someproject/tags/list
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"test/someproject","Action":"pull"}]}]}
그러나 대문자 구성 요소로이 작업을 시도하면 404 만 반환됩니다.
(authorization step done but not shown here)
$ curl -s -H "Authorization: Bearer $TOKEN" -X GET https://docker.uibk.ac.at:443/v2/test/Someproject/tags/list
404 page not found
특정 다중 환경 변수 인라인 동안 -e 플래그를 놓치는 경우가 있습니다.
예 : 나쁨 : docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>
좋은: docker run --name somecontainername -e ENV_VAR1=somevalue1 -e ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>
reference
Docker의 A 는 이미지를 가리키는 것입니다. 원격 레지스트리 또는 로컬 레지스트리에있을 수 있습니다. 먼저 오류 메시지를 설명하고 이에 대한 해결책을 보여 드리겠습니다.
잘못된 참조 형식
이것은 우리가 사용한 참조가 유효한 형식이 아님을 의미합니다. 즉, 이미지를 식별하는 데 사용한 참조 (포인터)가 유효하지 않습니다. 일반적으로 다음과 같은 설명이 이어집니다. 이렇게하면 오류가 훨씬 더 명확 해집니다.
잘못된 참조 형식 : 저장소 이름은 소문자 여야합니다.
이는 우리가 사용하는 참조에 대문자가 없어야 함을 의미합니다. docker run Ubuntu
( wrong ) vs docker run ubuntu
( correct )를 실행 해보십시오 . Docker는 이미지 참조로 대문자를 허용하지 않습니다. 간단한 문제 해결 단계.
1) Dockerfile 은 이미지로 대문자를 포함합니다.
FROM Ubuntu (wrong)
FROM ubuntu (correct)
2) docker-compose.yml에 정의 된 이미지 이름에 대문자가 있습니다.
3) Docker 컨테이너를 배포하기 위해 Jenkins 또는 GoCD를 사용하는 경우 이미지 이름에 대문자가 포함되어 있는지 여부를 확인하십시오.
이 오류에 대해 특별히 작성된 이 문서를 읽으십시오 .
"docker build -f Dockerfile -t SpringBoot-Docker." 위의 추천에서와 같이 docker 컨테이너에 대한 이미지 파일을 생성하고 있습니다. commend는 create image use file ( -f refer to docker file )과 -t를 docker로 푸시 할 이미지 파일의 대상으로 말합니다 . "." 현재 디렉토리를 나타냅니다.
위의 문제에 대한 해결책 : 대상 이미지 이름을 소문자로 제공
제 경우에는 도커를 통해 postgres를 실행하려고했습니다. 처음에는 다음과 같이 실행했습니다.
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
각 환경 변수 다음에 -e 가 누락되었습니다 . 위의 명령을 아래 명령으로 변경하면 효과가 있습니다.
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
제 경우 --env
에는 실제 변수 이름이나 값이없는 스위치가 있습니다. 예 :
docker run \
--env \ <----- This was the offending item
--rm \
--volume "/home/shared:/shared" "$(docker build . -q)"