Lỗi Docker: định dạng tham chiếu không hợp lệ: tên kho lưu trữ phải là chữ thường


87

Gặp lỗi Docker này với một trong các dự án của tôi:

invalid reference format: repository name must be lowercase

Những nguyên nhân khác nhau cho thông điệp chung chung này là gì?

Tôi đã tìm ra nó sau một số nỗ lực, vì vậy tôi sẽ trả lời câu hỏi của riêng mình để ghi lại nó ở đây vì giải pháp không xuất hiện ngay lập tức khi thực hiện tìm kiếm trên web và cũng vì thông báo lỗi này không mô tả vấn đề trực tiếp Docker gặp phải.


"tham chiếu" trong thông báo lỗi này là định danh của một hình ảnh, như BMitch giải thích trong câu trả lời của mình. Vì vậy, định dạng của giá trị bạn đã sử dụng để trỏ đến hình ảnh không hợp lệ. Đọc lời giải thích đầy đủ của BMitch: stackoverflow.com/a/52818152/336694
HostedMetrics.com

Câu trả lời:


81

"Tham chiếu" trong docker là một con trỏ đến một hình ảnh. Nó có thể là tên hình ảnh, ID hình ảnh, bao gồm máy chủ đăng ký trong tên, sử dụng thẻ sha256 để ghim hình ảnh và bất kỳ thứ gì khác có thể được sử dụng để trỏ đến hình ảnh bạn muốn chạy.

Thông invalid reference formatbáo lỗi có nghĩa là docker không thể chuyển đổi chuỗi bạn đã cung cấp thành hình ảnh. Đây có thể là tên không hợp lệ hoặc có thể do lỗi phân tích cú pháp trước đó trong docker rundòng lệnh nếu đó là cách bạn chạy hình ảnh. Với tệp soạn thư, nếu bạn mở rộng một biến trong tên hình ảnh, thì biến đó có thể không được mở rộng chính xác.

Với docker rundòng lệnh, điều này thường dẫn đến việc không trích dẫn các tham số bằng dấu cách và nhầm thứ tự của dòng lệnh. Dòng lệnh được sắp xếp như sau:

docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_to_exec}

Lỗi phổ biến nhất khi truyền các args cho quá trình chạy là ánh xạ khối mở rộng tên đường dẫn bao gồm khoảng trắng trong đó và không trích dẫn đường dẫn hoặc thoát khỏi khoảng trắng. Ví dụ

docker run -v $(pwd):/data image_ref

Và cách khắc phục dễ dàng như:

docker run -v "$(pwd):/data" image_ref

3
"Với dòng lệnh chạy của docker, điều này thường dẫn đến việc không trích dẫn các tham số có dấu cách và nhầm thứ tự của dòng lệnh" Điều này thực sự hữu ích
user979899 Ngày

Bài đăng cực kỳ hữu ích ngay cả 2 năm sau!
Geo

Làm việc hoàn hảo. Cảm ơn!
Igor Melão

24

Hãy để tôi nhấn mạnh rằng Docker thậm chí không cho phép các ký tự hỗn hợp.

Tốt: docker build -t myfirstechoimage:0.1 .

Xấu: docker build -t myFirstEchoImage:0.1 .


1
Wow, điều này đã tiết kiệm rất nhiều nỗ lực!
tò mò

1
Tôi đang sử dụng sự phụ thuộc maven "spotify" trong dự án SpringBoot để xây dựng hình ảnh docker và từ vài giờ trước, tôi đã rất vất vả để hiểu vấn đề. Tên của dự án (bao gồm các ký tự viết hoa) hóa ra là vấn đề!
Abhishek Aggarwal

15

có một khoảng trống trong thư mục làm việc hiện tại và chỉ $(pwd)định cho khối lượng bản đồ. Không thích khoảng trắng trong tên thư mục.


2
Điều đó đã giải quyết nó cho tôi! Tôi gói $(pwd)trong dấu ngoặc kép và nó hoạt động.
MerseyViking

15

Trong trường hợp của tôi là -etrước các tham số cho trình docker mysql

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

Cũng kiểm tra xem có thiếu khoảng trắng không


5
Tương tự với tôi, tôi đã thiếu -etrước một trong các biến môi trường của mình.
Eric Bishard

trong trường hợp của tôi, tôi đã quên xuất biến từ môi trường bên ngoài.
Przemek

8

Trong trường hợp của tôi, tên hình ảnh được xác định bằng docker-compose.ymlchữ hoa. Thực tế là thông báo lỗi được đề cập repositorythay vì imagekhông giúp mô tả vấn đề và phải mất một thời gian để tìm ra.


1
Một nguyên nhân phổ biến khác được tìm thấy khi tìm kiếm trên web là mọi người có ký tự khoảng trắng trong tên thư mục của họ khi gắn ổ đĩa.
HostedMetrics.com

Nó xảy ra với tôi vì một lý do khác. Bản dựng nhiều tầng của docker bên trong Dockerfile như được đặt tên bằng các chữ cái viết hoa. Ví dụ: FROM bla:bla AS BUILDkhông thành công. FROM bla:bla AS buildđược rồi Thx!
Anderson Marques

8

Trong trường hợp của tôi, vấn đề là trong việc sắp xếp các tham số. Ban đầu tôi có --nametham số sau tham số môi trường và sau đó là âm lượng và attach_dbs tham số, và hình ảnh ở cuối lệnh như bên dưới.

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

Sau khi sắp xếp lại các thông số như bên dưới, mọi thứ đều hoạt động tốt (về cơ bản đặt --nametham số theo sau là tên hình ảnh).

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

Trên MacOS khi bạn đang làm việc trên ổ iCloud, $ PWD của bạn sẽ chứa một thư mục "Tài liệu Di động". Nó có vẻ không thích không gian!

Để giải quyết vấn đề, tôi đã sao chép dự án của mình vào ổ đĩa cục bộ, nơi không có khoảng trống trong đường dẫn đến thư mục dự án của tôi.

Tôi không thấy cách nào để bạn có thể thay đổi đường dẫn mặc định đến iCloud là ~/Library/Mobile Documents/com~apple~CloudDocs

Khoảng trống trong đường dẫn trong "Tài liệu di động" dường như là thứ mà docker run không thích.


1
Thay vì sao chép dự án, bạn có thể thoát khỏi không gian, ví dụ Mobile\ Documents
efru 18/02 '19

1

Thay thế image: ${DOCKER_REGISTRY}notificationsapi bằng image:notificationsapi hoặc image: ${docker_registry}notificationsapi trong docker-compost.yml đã giải quyết được vấn đề

tệp có lỗi

  version: '3.4'

services:
  notifications.api:
    image: ${DOCKER_REGISTRY}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

tệp không có lỗi

version: '3.4'

services:
 notifications.api:
    image: ${docker_registry}notificationsapi
    build:
      context: .
      dockerfile: ../Notifications.Api/Dockerfile

Vì vậy, tôi nghĩ rằng lỗi là do các chữ cái không phải chữ thường mà nó có


1

Đối với tôi, vấn đề là với không gian trong ánh xạ khối lượng không được thoát. Công việc jenkins đang chạy lệnh docker run có một khoảng trống trong đó và kết quả là công cụ docker không thể hiểu lệnh chạy của docker.


1

Thật vậy, sổ đăng ký docker tính đến ngày hôm nay (sha 2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305) không xử lý các đường dẫn chứa ký tự chữ hoa. Đây rõ ràng là một lựa chọn thiết kế kém, có thể là do muốn duy trì khả năng tương thích với một số hệ điều hành nhất định không phân biệt chữ hoa chữ thường ở cấp độ tệp (tức là cửa sổ ).

Nếu một người xác thực cho một phạm vi và cố gắng tìm nạp một kho lưu trữ không tồn tại với tất cả chữ thường, đầu ra là

(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"}]}]}

Tuy nhiên, nếu một người cố gắng làm điều này với một thành phần chữ hoa, chỉ 404 được trả về:

(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

đôi khi bạn bỏ lỡ -e gắn cờ trong khi nội tuyến nhiều env vars cụ thể

ví dụ: xấu: docker run --name somecontainername -e ENV_VAR1=somevalue1 ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>

tốt: docker run --name somecontainername -e ENV_VAR1=somevalue1 -e ENV_VAR2=somevalue2 -d -v "mypath:containerpath" <imagename e.g. postgres>


1

A referencetrong Docker là những gì trỏ đến một hình ảnh. Điều này có thể nằm trong sổ đăng ký từ xa hoặc đăng ký cục bộ. Hãy để tôi mô tả thông báo lỗi trước và sau đó hiển thị các giải pháp cho vấn đề này.

định dạng tham chiếu không hợp lệ

Điều này có nghĩa là tham chiếu chúng tôi đã sử dụng không phải là định dạng hợp lệ. Điều này có nghĩa là, tham chiếu (con trỏ) chúng tôi đã sử dụng để xác định hình ảnh không hợp lệ. Nói chung, điều này được theo sau bởi một mô tả như sau. Điều này sẽ làm cho lỗi rõ ràng hơn nhiều.

định dạng tham chiếu không hợp lệ: tên kho lưu trữ phải là chữ thường

Điều này có nghĩa là tham chiếu mà chúng tôi đang sử dụng không được có chữ hoa. Thử chạy docker run Ubuntu( sai ) so với docker run ubuntu( đúng ). Docker không cho phép bất kỳ ký tự viết hoa nào làm tham chiếu hình ảnh. Các bước khắc phục sự cố đơn giản.

1) Dockerfile chứa các chữ cái in hoa dưới dạng hình ảnh.

FROM Ubuntu (wrong)
FROM ubuntu (correct)

2) Tên hình ảnh được xác định trong docker-compos.yml có các chữ cái viết hoa

3) Nếu bạn đang sử dụng Jenkins hoặc GoCD để triển khai vùng chứa docker của mình, vui lòng kiểm tra lệnh chạy, xem tên hình ảnh có bao gồm chữ hoa không.

Vui lòng đọc tài liệu này được viết riêng cho lỗi này.


0

Tôi đã gặp lỗi tương tự và vì một số lý do mà nó có vẻ là do các chữ hoa trong công việc Jenkins chạy docker runlệnh.


0

Điều này xảy ra do các khoảng trống trong thư mục làm việc hiện tại đến từ $(pwd)các tập bản đồ. Vì vậy, tôi đã sử dụng docker-composethay thế.

Tập docker-compose.ymltin.

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." Như trong phần khen ngợi ở trên, chúng tôi đang tạo một tệp hình ảnh cho vùng chứa docker. khen ngợi nói tạo tệp sử dụng hình ảnh ( -f tham khảo tệp docker ) và -t cho mục tiêu của tệp hình ảnh mà chúng tôi sẽ đẩy lên docker. các "." đại diện cho thư mục hiện tại

giải pháp cho vấn đề trên: cung cấp tên hình ảnh đích ở dạng chữ thường


0

Docker có thể tạo hình ảnh tự động bằng cách đọc hướng dẫn từ Dockerfile. Dockerfile là một tài liệu văn bản chứa tất cả các lệnh mà người dùng có thể gọi trên dòng lệnh để lắp ráp một hình ảnh. ví dụ: FROM python: 3.7-alpine 'python' phải ở dạng chữ thường


0

Trong trường hợp của tôi, tôi đang cố gắng chạy postgres thông qua docker. Ban đầu tôi chạy như sau:

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

Tôi đã thiếu -e sau mỗi biến môi trường. Thay đổi lệnh trên thành lệnh dưới đây đã hoạt động

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

Tôi ước gì thông báo lỗi sẽ xuất ra chuỗi sự cố. Tôi nhận được điều này do sự cố sao chép và dán kỳ lạ của lệnh "docker run". Một ký tự giống như dấu cách đã được sử dụng trước tên repo và hình ảnh.


0

Hầu hết các câu trả lời ở trên không phù hợp với trường hợp của tôi, vì vậy tôi sẽ ghi lại điều này trong trường hợp ai đó thấy nó hữu ích. Dòng đầu tiên trong tệp dockerfile FROM node:10đối với trường hợp của tôi, nút từ không nên là chữ hoa, tức là FROM NODE:10. Tôi đã thực hiện thay đổi đó và nó đã hoạt động.


0

Trong trường hợp của tôi, DockerFile chứa tên hình ảnh trong trường hợp hỗn hợp thay vì chữ thường.

Dòng trước đó trong DockerFile của tôi

FROM CentOs

và khi tôi thay đổi ở trên thành FROM centos, nó hoạt động trơn tru.


0

Trong trường hợp của tôi, tôi có một --envcông tắc rỗng, tức là một công tắc không có tên hoặc giá trị biến thực tế, ví dụ:

docker run \
   --env \       <----- This was the offending item
   --rm \
   --volume "/home/shared:/shared" "$(docker build . -q)"

-2

Cố gắng sử dụng các ký tự chữ thường trong DockerFile của bạn

Ví dụ, sử dụng:

openjdk:8

thay vì

openJDK:8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.