Docker 오류 : 잘못된 참조 형식 : 저장소 이름은 소문자 여야합니다.


93

내 프로젝트 중 하나에서이 Docker 오류가 발생했습니다.

invalid reference format: repository name must be lowercase

이 일반 메시지의 다양한 원인은 무엇입니까?

나는 이미 약간의 노력 끝에 그것을 알아 냈기 때문에 웹 검색을 할 때 해결책이 즉시 나타나지 않고이 오류 메시지가 설명하지 않기 때문에 여기에 문서화하기 위해 내 질문에 답할 것입니다. Docker가 직면하는 직접적인 문제.


이 오류 메시지의 "참조"는 BMitch가 그의 답변에서 설명했듯이 이미지의 식별자입니다. 따라서 이미지를 가리키는 데 사용한 값의 형식이 잘못되었습니다. BMitch의 전체 설명 읽기 : stackoverflow.com/a/52818152/336694
HostedMetrics.com

답변:


88

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

3
이건 정말 도움이되었다 "는 고정 표시기 실행 명령 행, 이것은 종종 공백 매개 변수를 인용, 명령 줄의 순서 착각하지의 결과이다"
user979899을

2 년 후에도 매우 유용한 게시물!
지오

완벽하게 일했습니다. 감사!
Igor Melão

25

Docker는 혼합 문자도 허용하지 않는다는 점을 강조하겠습니다 .

좋은: docker build -t myfirstechoimage:0.1 .

나쁜: docker build -t myFirstEchoImage:0.1 .


1
와우, 이것은 많은 노력을 절약했습니다!
호기심 많은

1
저는 SpringBoot 프로젝트에서 "spotify"maven 종속성을 사용하여 docker 이미지를 빌드하고 있으며 지난 몇 시간 동안 문제를 이해하는 데 어려움을 겪었습니다. 문제가 될 프로젝트 이름 (대문자 포함)!
Abhishek Aggarwal

18

제 경우에는 -emysql 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

누락 된 공백이 있는지도 확인하십시오.


5
저와 마찬가지로 -e환경 변수 중 하나 가 누락되었습니다 .
Eric Bishard

제 경우에는 외부 환경에서 변수를 내보내는 것을 잊었습니다.
Przemek

15

현재 작업 디렉토리에 공간이 있고 $(pwd)볼륨을 매핑하는 데 사용됩니다. 디렉토리 이름의 공백을 좋아하지 않습니다.


2
그것은 나를 위해 그것을 해결했습니다! 나는 $(pwd)따옴표로 싸서 작동했습니다.
MerseyViking

8

제 경우에는 이미지 이름에 docker-compose.yml대문자 가 포함되어 있습니다. repository대신 언급 된 오류 메시지 image가 문제를 설명하는 데 도움이되지 않았고 파악하는 데 시간이 걸렸습니다.


1
웹 검색에서 발견 된 또 다른 일반적인 원인은 볼륨을 마운트 할 때 디렉토리 이름에 공백 문자가 있다는 것입니다.
HostedMetrics.com

다른 이유로 나에게 일어났습니다. 대문자로 명명 된 Dockerfile 내부의 docker 다단계 빌드입니다. 예 : FROM bla:bla AS BUILD실패. FROM bla:bla AS build괜찮 았습니다 Thx!
Anderson Marques

8

제 경우에는 매개 변수 배열에 문제가있었습니다. 처음에는 --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']}]"

4

MacOS에서 iCloud 드라이브로 작업 할 때 $ PWD에는 "Mobile Documents"디렉토리가 포함됩니다. 공간이 마음에 들지 않는 것 같습니다!

해결 방법으로 내 프로젝트 폴더 경로에 공간이없는 로컬 드라이브에 프로젝트를 복사했습니다.

나는 당신이 iCloud의 기본 경로를 changnig 돌아 다니는 방법을 보지 못합니다. ~/Library/Mobile Documents/com~apple~CloudDocs

"Mobile Documents"의 경로에있는 공간은 docker run이 좋아하지 않는 것 같습니다.


1
프로젝트를 복사하는 대신 공간을 벗어날 수 있습니다. 예 Mobile\ Documents
efru

1

docker-compose.yml image: ${DOCKER_REGISTRY}notificationsapiimage: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

그래서 오류가 소문자가 아닌 것 때문이라고 생각합니다.


1

나에게 문제는 이스케이프되지 않은 볼륨 매핑의 공간이었습니다. docker run 명령을 실행하는 jenkins 작업에 공백이있어서 그 결과 docker 엔진이 docker run 명령을 이해할 수 없었습니다.


1

실제로 오늘날의 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

1

특정 다중 환경 변수 인라인 동안 -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>


1

referenceDocker의 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를 사용하는 경우 이미지 이름에 대문자가 포함되어 있는지 여부를 확인하십시오.

이 오류에 대해 특별히 작성된 이 문서를 읽으십시오 .


0

동일한 오류가 발생했으며 어떤 이유로 docker run명령 을 실행 한 Jenkins 작업의 대문자로 인해 발생한 것으로 보입니다 .


0

이것은 $(pwd)맵 볼륨 에 대한 현재 작업 디렉토리의 공간 때문에 발생 합니다. 그래서 docker-compose대신 사용 했습니다.

docker-compose.yml파일.

version: '3'
services:
  react-app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - /app/node_modules
      - .:/app

0

"docker build -f Dockerfile -t SpringBoot-Docker." 위의 추천에서와 같이 docker 컨테이너에 대한 이미지 파일을 생성하고 있습니다. commend는 create image use file ( -f refer to docker file )과 -t를 docker로 푸시 할 이미지 파일의 대상으로 말합니다 . "." 현재 디렉토리를 나타냅니다.

위의 문제에 대한 해결책 : 대상 이미지 이름을 소문자로 제공


0

Docker는 Dockerfile에서 지침을 읽어 이미지를 자동으로 빌드 할 수 있습니다. Dockerfile은 사용자가 이미지를 어셈블하기 위해 명령 줄에서 호출 할 수있는 모든 명령이 포함 된 텍스트 문서입니다. 예 : FROM python : 3.7-alpine 'python'은 소문자 여야합니다.


0

제 경우에는 도커를 통해 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


0

오류 메시지가 문제 문자열을 출력하기를 바랍니다. "docker run"명령의 이상한 복사 및 붙여 넣기 문제로 인해이 문제가 발생했습니다. 저장소 및 이미지 이름 앞에 공백 과 같은 문자가 사용되었습니다.


0

위 답변의 대부분은 내 경우에 효과가 없었으므로 누군가가 도움이 될 경우 문서화하겠습니다. dockerfile의 첫 번째 라인 FROM node:10내 경우에는 단어 노드는대문자FROM NODE:10. 나는 그 변화를 일으켰고 효과가 있었다.


0

제 경우에는 DockerFile에 소문자 대신 대소 문자가 혼합 된 이미지 이름이 포함되어 있습니다.

내 DockerFile의 이전 줄

FROM CentOs

위에서로 변경하면 FROM centos원활하게 작동했습니다.


0

제 경우 --env에는 실제 변수 이름이나 값이없는 스위치가 있습니다. 예 :

docker run \
   --env \       <----- This was the offending item
   --rm \
   --volume "/home/shared:/shared" "$(docker build . -q)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.