ข้อผิดพลาดนักเทียบท่า: รูปแบบการอ้างอิงไม่ถูกต้อง: ชื่อที่เก็บต้องเป็นตัวพิมพ์เล็ก


93

พบข้อผิดพลาด Docker นี้กับหนึ่งในโครงการของฉัน:

invalid reference format: repository name must be lowercase

อะไรคือสาเหตุต่างๆสำหรับข้อความทั่วไปนี้

ฉันคิดออกแล้วหลังจากใช้ความพยายามดังนั้นฉันจะตอบคำถามของตัวเองเพื่อบันทึกไว้ที่นี่เนื่องจากวิธีแก้ปัญหาไม่เกิดขึ้นทันทีเมื่อทำการค้นหาเว็บและเนื่องจากข้อความแสดงข้อผิดพลาดนี้ไม่ได้อธิบาย ปัญหาโดยตรงที่ Docker พบ


"การอ้างอิง" ในข้อความแสดงข้อผิดพลาดนี้คือตัวระบุรูปภาพตามที่ BMitch อธิบายไว้ในคำตอบของเขา ดังนั้นรูปแบบของค่าที่คุณใช้ชี้ไปที่รูปภาพจึงไม่ถูกต้อง อ่านคำอธิบายทั้งหมดของ BMitch: stackoverflow.com/a/52818152/336694
HostedMetrics.com

คำตอบ:


88

"การอ้างอิง" ในนักเทียบท่าเป็นตัวชี้ไปที่รูปภาพ อาจเป็นชื่อรูปภาพ ID รูปภาพรวมเซิร์ฟเวอร์รีจิสตรีในชื่อใช้แท็ก sha256 เพื่อตรึงรูปภาพและสิ่งอื่น ๆ ที่สามารถใช้เพื่อชี้ไปที่รูปภาพที่คุณต้องการเรียกใช้

invalid reference formatข้อผิดพลาดหมายถึงนักเทียบท่าไม่สามารถแปลงสตริงที่คุณได้ให้กับภาพ นี่อาจเป็นชื่อที่ไม่ถูกต้องหรืออาจมาจากข้อผิดพลาดในการแยกวิเคราะห์ก่อนหน้านี้ในdocker runบรรทัดคำสั่งหากนั่นคือวิธีที่คุณเรียกใช้รูปภาพ ด้วยไฟล์เขียนหากคุณขยายตัวแปรในชื่อรูปภาพตัวแปรนั้นอาจขยายได้ไม่ถูกต้อง

ด้วย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
"ด้วยบรรทัดคำสั่ง docker run มักเป็นผลให้ไม่อ้างถึงพารามิเตอร์ด้วยช่องว่างและทำให้ลำดับของบรรทัดคำสั่งผิด" สิ่งนี้มีประโยชน์มาก
user979899

โพสต์ที่มีประโยชน์มากแม้ 2 ปีให้หลัง!
Geo

ทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ!
Igor Melão

25

ขอย้ำว่าDocker ไม่อนุญาตให้ใช้อักขระผสมกัน

ดี: docker build -t myfirstechoimage:0.1 .

แย่: docker build -t myFirstEchoImage:0.1 .


1
ว้าวนี้ช่วยประหยัดความพยายามได้มาก!
อยากรู้อยากเห็น

1
ฉันใช้การพึ่งพา maven "spotify" ในโครงการ SpringBoot เพื่อสร้างภาพนักเทียบท่าและในช่วงสองสามชั่วโมงที่ผ่านมาฉันพยายามดิ้นรนเพื่อทำความเข้าใจปัญหา ชื่อของโครงการ (มีตัวพิมพ์ใหญ่) กลายเป็นปัญหา!
Abhishek Aggarwal

18

ในกรณีของฉันคือ-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

ตรวจสอบด้วยว่าไม่มีช่องว่างหรือไม่


5
เช่นเดียวกับฉันฉันขาด-eตัวแปรสภาพแวดล้อมตัวหนึ่งก่อนหน้านี้
Eric Bishard

ในกรณีของฉันฉันลืมส่งออกตัวแปรจากสภาพแวดล้อมภายนอก
Przemek

15

มีช่องว่างในไดเร็กทอรีการทำงานปัจจุบันและใช้$(pwd)เพื่อแม็พไดรฟ์ข้อมูล ไม่ชอบช่องว่างในชื่อไดเรกทอรี


2
ที่แก้ไขให้ฉัน! ฉันห่อด้วย$(pwd)คำพูดและมันได้ผล
MerseyViking

8

ในกรณีของฉันชื่อภาพที่กำหนดเป็นdocker-compose.ymlตัวอักษรตัวพิมพ์ใหญ่ ความจริงที่ว่าเกิดข้อผิดพลาดดังกล่าวrepositoryแทนimageไม่ได้ช่วยอธิบายปัญหาและจะเอาในขณะที่จะคิดออก


1
สาเหตุทั่วไปอีกประการหนึ่งที่พบจากการค้นหาเว็บคือผู้คนมีอักขระช่องว่างในชื่อไดเร็กทอรีของตนเมื่อติดตั้งไดรฟ์ข้อมูล
HostedMetrics.com

มันเกิดขึ้นกับฉันด้วยเหตุผลอื่น นักเทียบท่าหลายขั้นตอนสร้างภายใน Dockerfile ตามชื่อด้วยตัวอักษรตัวบน ตัวอย่าง: 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 ซึ่งเป็นได้ ~/Library/Mobile Documents/com~apple~CloudDocs

ช่องว่างในเส้นทางใน "เอกสารมือถือ" ดูเหมือนจะเป็นสิ่งที่นักเทียบท่าไม่ชอบ


1
แทนที่จะคัดลอกโครงการคุณสามารถหลีกเลี่ยงช่องว่างได้เช่น Mobile\ Documents
efru

1

แทนที่image: ${DOCKER_REGISTRY}notificationsapi ด้วยimage:notificationsapi หรือ image: ${docker_registry}notificationsapi ใน docker-compose.yml ช่วยแก้ปัญหาได้

ไฟล์ที่มีข้อผิดพลาด

  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 มีช่องว่างอยู่และเป็นผลให้นักเทียบท่าเอ็นจินไม่เข้าใจคำสั่งรันนักเทียบท่า


1

อันที่จริงการลงทะเบียนนักเทียบท่า ณ วันนี้ (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 ในขณะที่ระบุ env vars แบบอินไลน์หลายรายการ

เช่นไม่ดี: 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

A referenceใน Docker คือสิ่งที่ชี้ไปที่รูปภาพ สิ่งนี้อาจอยู่ในรีจิสทรีระยะไกลหรือรีจิสทรีภายในเครื่อง ให้ฉันอธิบายข้อความแสดงข้อผิดพลาดก่อนจากนั้นจึงแสดงวิธีแก้ไขปัญหานี้

รูปแบบการอ้างอิงไม่ถูกต้อง

ซึ่งหมายความว่าการอ้างอิงที่เราใช้ไม่ใช่รูปแบบที่ถูกต้อง ซึ่งหมายความว่าข้อมูลอ้างอิง (ตัวชี้) ที่เราใช้ระบุรูปภาพนั้นไม่ถูกต้อง โดยทั่วไปจะตามด้วยคำอธิบายดังนี้ สิ่งนี้จะทำให้ข้อผิดพลาดชัดเจนขึ้นมาก

รูปแบบการอ้างอิงไม่ถูกต้อง: ชื่อที่เก็บต้องเป็นตัวพิมพ์เล็ก

ซึ่งหมายความว่าข้อมูลอ้างอิงที่เราใช้ไม่ควรมีตัวพิมพ์ใหญ่ ลองรันdocker run Ubuntu( ผิด ) vs docker run ubuntu( ถูกต้อง ) นักเทียบท่าไม่อนุญาตให้ใช้อักขระตัวพิมพ์ใหญ่ใด ๆ ในการอ้างอิงรูปภาพ ขั้นตอนการแก้ปัญหาง่ายๆ

1) Dockerfileมีตัวพิมพ์ใหญ่เป็นรูปภาพ

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) ชื่อภาพที่กำหนดในdocker-compose.ymlมีตัวอักษรตัวพิมพ์ใหญ่

3) หากคุณใช้ Jenkins หรือ GoCD ในการปรับใช้ docker container โปรดตรวจสอบคำสั่ง run ว่าชื่อภาพมีอักษรตัวใหญ่หรือไม่

โปรดอ่านเอกสารนี้ที่เขียนขึ้นโดยเฉพาะสำหรับข้อผิดพลาดนี้


0

ฉันมีข้อผิดพลาดเดียวกันและด้วยเหตุผลบางอย่างดูเหมือนว่าจะเกิดจากตัวอักษรตัวพิมพ์ใหญ่ในงานเจนกินส์ที่รันdocker runคำสั่ง


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

"นักเทียบท่า build -f Dockerfile -t SpringBoot-Docker" ตามที่กล่าวไว้ข้างต้นเรากำลังสร้างไฟล์รูปภาพสำหรับ Docker container ยกย่องว่าสร้างไฟล์การใช้รูปภาพ ( -f อ้างถึงไฟล์นักเทียบท่า ) และ -t สำหรับเป้าหมายของไฟล์ภาพที่เราจะส่งไปยังนักเทียบท่า ที่ "." แทนไดเร็กทอรีปัจจุบัน

วิธีแก้ปัญหาข้างต้น: ระบุชื่อรูปภาพเป้าหมายเป็นตัวพิมพ์เล็ก


0

นักเทียบท่าสามารถสร้างภาพโดยอัตโนมัติโดยอ่านคำแนะนำจาก 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

ฉันหวังว่าข้อความแสดงข้อผิดพลาดจะส่งออกสตริงปัญหา ฉันได้รับสิ่งนี้เนื่องจากปัญหาการคัดลอกและการวางแปลก ๆ ของคำสั่ง "นักเทียบท่าวิ่ง" มีการใช้อักขระแบบเว้นวรรคก่อน repo และชื่อรูปภาพ


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.