Không thể đẩy hình ảnh lên Amazon ECR - thất bại với không có thông tin xác thực cơ bản


172

Tôi đang cố gắng đẩy hình ảnh docker lên đăng ký Amazon ECR. Tôi đang sử dụng docker client Docker phiên bản 1.9.1, bản dựng a34a1d5. Tôi sử dụng aws ecr get-login --region us-east-1để có được các tín dụng đăng nhập docker. Sau đó, tôi đăng nhập thành công với các khoản tín dụng như sau:

docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com
WARNING: login credentials saved in /Users/ar/.docker/config.json
Login Succeeded

Nhưng khi tôi cố gắng đẩy hình ảnh của mình, tôi gặp phải lỗi sau:

$ docker push ####.dkr.ecr.us-east-1.amazonaws.com/image:latest
The push refers to a repository [####.dkr.ecr.us-east-1.amazonaws.com/image] (len: 1)
bcff5e7e3c7c: Preparing 
Post https://####.dkr.ecr.us-east-1.amazonaws.com/v2/image/blobs/uploads/: no basic auth credentials

Tôi chắc chắn rằng người dùng aws có quyền chính xác. Tôi cũng đảm bảo rằng kho lưu trữ cho phép người dùng đẩy vào nó. Chỉ để đảm bảo rằng đó không phải là vấn đề tôi đặt đăng ký để cho phép tất cả người dùng truy cập đầy đủ. Không có gì thay đổi "no basic auth credentials"lỗi. Tôi không biết làm thế nào để bắt đầu gỡ lỗi này vì tất cả lưu lượng được mã hóa.

CẬP NHẬT

Vì vậy, tôi đã có một chút khoảnh khắc Homer Simpson D'Oh khi tôi nhận ra nguyên nhân sâu xa của vấn đề của mình. Tôi có quyền truy cập vào nhiều tài khoản AWS. Mặc dù tôi đang sử dụng aws configuređể đặt thông tin đăng nhập cho tài khoản nơi tôi đã thiết lập kho lưu trữ của mình nhưng aws cli thực sự đang sử dụng các biến môi trường AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY. Vì vậy, khi tôi làm aws ecr get-loginđiều đó là trả lại một đăng nhập cho tài khoản sai. Tôi không nhận thấy rằng số tài khoản là khác nhau cho đến khi tôi quay lại để thử một số câu trả lời được đề xuất. Khi tôi loại bỏ các biến môi trường, mọi thứ hoạt động chính xác. Tôi đoán phương châm của câu chuyện là nếu bạn gặp phải lỗi này, hãy đảm bảo rằng kho lưu trữ bạn đang đăng nhập khớp với thẻ bạn đã áp dụng cho hình ảnh.


10
Bạn nên thực hiện cập nhật đó đậm, gạch chân và in nghiêng. Tôi cũng vừa có khoảnh khắc Homer Simpson đó. Cảm ơn bạn!
Mike

Cảm ơn vì đã thu hẹp nó! Bạn đã cứu ngày của tôi theo nghĩa đen!
simonso

2
Lỗi tương tự được đưa ra khi kho lưu trữ không tồn tại. Kiểm tra xem bạn đã tạo repo ở đúng vùng chưa.
Ilia Sidorenko


Lưu ý rằng bạn có thể thiết lập aws cli của mình để xử lý nhiều hồ sơ người dùng: docs.aws.amazon.com/cli/latest/userguide/ Kẻ
Peter Berg

Câu trả lời:


110

nếu bạn chạy $(aws ecr get-login --region us-east-1)nó sẽ hoàn thành cho bạn


17
Bạn là một huyền thoại. Hướng dẫn AWS có tất cả 5 bước với lệnh shell trừ bước 2, chỉ nói "Chạy lệnh đăng nhập docker đã được trả lại ở bước trước." Tôi đoán cả đống người như tôi chỉ tập trung vào lệnh shell và không đọc đúng hướng dẫn
Tiên Định

Cỗ máy thời gian - Tại sao việc gói lệnh aws trong $ () khiến đăng nhập thành công chính xác?
VtoCorleone

6
@VtoCorleone Vì lệnh aws chỉ in lệnh docker đến đầu ra tiêu chuẩn. Nếu bạn gói chuỗi đó bằng $ (), nó sẽ được hiểu bởi shell và docker loginlệnh sẽ được chạy.
Otavio Macedo

2
$ (aws ecr get-login --region us-west-2) cờ tốc ký không xác định: 'e' in -e Xem 'docker login --help'.
Ashish Karpe

23
nếu bạn nhận được "cờ tốc ký không xác định: 'e'", bạn phải chạy lệnh với cờ --no-gộp-email như thế này: $ (aws ecr get-login --region us-East-1 - không bao gồm email)
Trenton

57

Trong trường hợp của tôi, đây là một lỗi với Docker cho Windows và sự hỗ trợ của họ cho Trình quản lý thông tin Windows.

Mở của bạn ~/.docker/config.jsonvà loại bỏ các "credsStore": "wincred"mục.

Điều này sẽ khiến thông tin được viết config.jsontrực tiếp. Bạn sẽ phải đăng nhập lại sau đó.

Bạn có thể theo dõi lỗi này thông qua các vé # 22910# 24968 trên GitHub.


Cảm ơn - đã làm việc trên Windows 10. Sau khi xóa thuộc tính đó khỏi cấu hình và chạy lại lệnh đăng nhập docker, tệp cấu hình đã được cập nhật với thông tin đăng nhập và đẩy hoạt động.
Cameron

Tôi không thể tìm thấy tập tin cấu hình. Bạn có thể vui lòng gợi ý cho tôi vị trí của tệp config.json không?
Ramashanker Tripathi

@RamashankerTripathi Địa điểm nằm trong câu trả lời. Tôi không chắc làm thế nào tôi có thể rõ ràng hơn.
Der Hochstapler

@OliverSalzburg Cảm ơn bạn đã trả lời. Trên thực tế thư mục cài đặt Docker của tôi không chứa tệp config.json.
Ramashanker Tripathi

@RamashankerTripathi ~/.dockercó nghĩa là .dockertrong thư mục nhà của bạn. Hãy thử%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler

50

Nếu bạn sử dụng hồ sơ, đừng quên chuyển --profile=XXXđến aws ecr get-login.


27

Tôi đã có vấn đề này là tốt. Điều xảy ra với tôi là tôi quên chạy lệnh đã được trả lại cho tôi sau khi tôi chạy

aws ecr get-login --region ap-southeast-2

Lệnh này đã trả về một đốm lớn, bao gồm docker loginlệnh ngay tại đó! Tôi đã không nhận ra. Nó sẽ trả về một cái gì đó như thế này:

docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>

Sao chép và dán lệnh này và sau đó chạy lệnh đẩy docker của bạn trông giống như thế này:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename

1
Tôi không biết phản ứng blob đó là gì nên tôi bỏ qua nó. haha Cảm ơn đã chỉ ra điều này!
duyn9uyen 23/07/18

14

Điều này sẽ làm việc ngay cả khi không mở quyền. Xem tài liệu: Xác thực sổ đăng ký riêng .

[Chỉnh sửa: thực sự, tôi cũng gặp vấn đề về quyền khi thực hiện bài kiểm tra thứ hai. Xem Docker đẩy tới AWS ECR repo private không thành công với JSON không đúng định dạng ).]

Tuy nhiên, tôi đã có cùng một vấn đề; Tôi không biết tại sao, nhưng tôi đã sử dụng thành công cơ chế xác thực dài hơn được mô tả trong các tài liệu cho mã thông báo nhận ủy quyền

Phiên bản AWS CLI và Docker:

$ aws --version
aws-cli/1.9.17 Python/2.7.6 Linux/3.16.0-38-generic botocore/1.3.17
$ docker --version
Docker version 1.9.1, build a34a1d5

Nhận mã thông báo xác thực ('mật khẩu docker').

aws ecr get-authorization-token --region us-east-1 --output text \
    --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2

Lưu ý: My ~ / .aws / config chỉ định một vùng mặc định khác, vì vậy tôi cần đặt rõ ràng --region us-east-1.

Đăng nhập tương tác (thay đổi ############id tài khoản AWS của bạn):

docker login -u AWS https://############.dkr.ecr.us-east-1.amazonaws.com/
password: <paste the very long password from above>
email: <I left this blank>

Đẩy một hình ảnh (giả sử bạn đã tạo một hình ảnh docker test):

docker tag test:latest ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
docker push ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
The push refers to a repository [910732017890.dkr.ecr.us-east-1.amazonaws.com/test] (len: 1)
d5122f58a2e1: Pushed 
7bddbca3b908: Pushed 
latest: digest: sha256:bc0b521fd398bd1a2ef58a289dcb910334608723fd570e7bddb36eacd0060363 size: 4378

Làm thế nào bạn dán mật khẩu rất dài ??? Của tôi là một số dòng. Tôi đang sử dụng Windows Docker Quickstart Terminal, dường như không có khả năng sao chép / dán tốt, hoặc có lẽ tôi không thể tìm ra.
David

Đối với bất kỳ ai khác tự hỏi, tôi chỉ cần đánh dấu và sao chép toàn bộ, bao gồm cả khoảng trắng, và sau đó dán nó vào Notepad. Từ đó, tôi loại bỏ các ngắt dòng và ghi lại mọi thứ, và chỉ sau đó tôi mới có thể dán vào dòng lệnh đầu cuối. Điều đó đã làm việc.
David

Nếu bạn đang sử dụng PowerShell, hãy chuyển đến tab Thuộc tính> Tùy chọn và chọn "Bật lựa chọn gói dòng". Bằng cách đó, bạn có thể nhấp và kéo để chọn các dòng được bọc mà không phải sao chép thủ công vào Notepad, xóa các dòng mới, v.v.
adarshr

Tôi đã không chạm vào một máy cửa sổ trong gần 10 năm, nhưng bạn có thể luôn luôn ống stdout vào một tệp: aws ecr get-authorization-token > config.jsonvà sau đó mở nó trong trình soạn thảo văn bản yêu thích của bạn để sao chép và dán theo ý muốn
pcting

13

Hãy thử với:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')

trước khi đẩy.


Tôi đã nhận được điều nàyno basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

12

Cập nhật

Vì AWS CLI phiên bản 2 - aws ecr get-loginkhông được dùng nữa và phương thức đúng là aws ecr get-login-password.

Do đó, câu trả lời đúng và cập nhật là như sau: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com


11

Nếu nó giúp được ai ...

Vấn đề của tôi là tôi đã phải sử dụng --profile tùy chọn để xác thực với hồ sơ thích hợp từ tệp thông tin đăng nhập.

Tiếp theo, tôi đã sử dụng --region [region_name]lệnh này, nó cũng đưa ra lỗi "không có thông tin xác thực cơ bản".

Giải pháp cho tôi là thay đổi mệnh lệnh của mình từ đây:

aws ecr get-login

Về điều này:

aws --profile [profile_name] ecr get-login --region [region_name]

Thí dụ:

aws --profile foo ecr get-login --region us-east-1

Mong rằng sẽ giúp được ai đó!


1
Bạn đã cứu tôi! Tôi đã sử dụng hồ sơ aws của mình như thế này AWS_PROFILE=myprofile aws ecr get-loginvà nó không hoạt động nhưng việc giới thiệu hồ sơ aws với --profilelập luận tạo nên mánh khóe!
Colo Ghidini

8

Có một lỗi đã biết trong trình quản lý thông tin xác thực trên Windows. Xóa 'https: //' khỏi lệnh đăng nhập được tạo sẽ giải quyết điều này.

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com

thay vì

docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com

Xem thêm trang xử lý sự cố .


8

Tôi đã trải qua vấn đề tương tự.

Tạo thông tin xác thực AWS mới (khóa truy cập) và cấu hình lại AWS CLI với thông tin đăng nhập mới đã giải quyết vấn đề.

Trước đó, đã aws ecr get-login --region us-east-1tạo lệnh đăng nhập docker với URL đăng ký EC không hợp lệ.


Điều tương tự cũng xảy ra với tôi. Cảm ơn!
Greendrake

Đây là vấn đề của tôi. Tôi đã có một thông tin AWS CLI khác được lưu trữ trong ~ / .aws / thông tin đăng nhập so với aws tôi đang quản lý. Tái tạo thông tin đăng nhập mới và thiết lập đã làm việc.
Martin Alesten

5

Tôi gặp vấn đề này với một nguyên nhân khác: Tôi cần phải đẩy đến một sổ đăng ký không liên quan đến Tài khoản AWS của tôi (sổ đăng ký ECR của khách hàng). Khách hàng đã cấp cho tôi quyền truy cập trong tab Quyền cho đăng ký, bằng cách thêm id IAM của tôi (ví dụ arn:aws:iam::{AWS ACCT #}:user/{Username}:) làm Hiệu trưởng. Tôi đã cố gắng đăng nhập với các bước thông thường:

$(aws ecr get-login --region us-west-2 --profile profilename)
docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest

Mà tất nhiên dẫn đến no basic auth credentials. Khi nó bật ra , aws ecr get-loginđăng nhập bạn vào ECR cho đăng ký liên quan đến đăng nhập của bạn , điều này có ý nghĩa khi nhìn lại. Giải pháp là cho biết aws ecr get-login(các) đăng ký nào bạn muốn đăng nhập.

$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})

Sau đó, docker pushhoạt động tốt.


Điều này thật ý nghĩa. Nhưng những gì bạn nên vượt qua trong --profile? Tôi có một tài khoản cá nhân nhưng tôi đang cố gắng đẩy vào tài khoản công ty. Nói cách khác, tôi tìm thấy ở đâuprofilename
Ciprian Tomoiagă

1
@ CiprianTomoiagă bạn chỉ nên bao gồm điều đó nếu bạn đang sử dụng hồ sơ được đặt tên. Xem tại đây docs.aws.amazon.com/cli/latest/userguide/ Kẻ
Sergio

5
  1. Hãy chắc chắn rằng bạn đã tạo đăng ký ECR trước.
    Sau đó, theo Hướng dẫn Lệnh Đẩy ECR, cắt và dán các lệnh sau
  2. Thực thi lệnh đăng nhập docker (eval trên Mac / Linux bỏ qua phần cắt và dán)
    eval $(aws ecr get-login --region us-east-1)
    thêm --profile nếu bạn sử dụng nhiều Tài khoản AWS
    eval $(aws ecr get-login --region us-east-1 --profile your-profile)
  3. docker build -t image-name .
  4. docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
  5. docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest

Trong trường hợp có lỗi, hãy đảm bảo bạn chạy lại tất cả các lệnh! Thông tin đăng nhập bạn nhận được aws ecr get-loginlà tạm thời và sẽ hết hạn.


Tôi tìm ra cái gì để đặt your-profile?
Andy

Bạn có thể loại bỏ nó nếu bạn đang sử dụng hồ sơ mặc định
Jason

Tôi đã cố gắng tìm ra cách không sử dụng hồ sơ mặc định. Tôi đã tìm ra nó mặc dù, hồ sơ bổ sung có thể được nhập vào ~/.aws/config~/.aws/credentialscác tập tin.
Andy

5

Trong trường hợp của tôi, sau khi chạy aws ecr get-login --no-include-email --region *****, tôi chỉ sao chép đầu ra của lệnh đó với dạng docker login -u *** -p ************và bạn dán nó vào dấu nhắc. Việc đẩy đã đi trước.



4

Các tài liệu AWS yêu cầu bạn thực hiện lệnh sau (đối với vùng ap-south-2)

aws ecr get-login --region ap-southeast-2

Khi tôi gặp vấn đề này, tôi không rõ ràng dựa trên các tài liệu mà bạn cần nhập kết quả của lệnh này vào thiết bị đầu cuối và thực thi nó.

Khắc phục sự cố với tôi là sao chép kết quả vào bảng tạm với

aws ecr get-login --region ap-southeast-2 | pbcopy

Dán kết quả vào dòng lệnh và thực hiện nó


4

Sau khi chạy lệnh này:

(aws ecr get-login --no-include-email --region us-west-2)

chỉ cần chạy lệnh đăng nhập docker từ đầu ra

docker login -u AWS -p epJ....

là cách mà docker đăng nhập vào ECR


3

Lỗi này thường bị ném nếu đăng nhập ecr không thành công. Tôi đang sử dụng hệ thống windows và tôi đã sử dụng "Powershell" trong chế độ Quản trị viên để đăng nhập vào ecr trước.

Invoke-Expression $(aws ecr get-login --no-include-email)

Điều này sẽ xuất ra "Đăng nhập thành công".


cảm ơn bạn! Tại sao điều này giúp? tôi đã đăng nhập bằng saml2aws.
ảnh hưởng

2

Tôi đã đối mặt với cùng một vấn đề và lỗi tôi đã làm là sử dụng đường dẫn repo sai

ví dụ: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

Trong đường dẫn trên, đây là nơi tôi đã phạm sai lầm: "dkr.ecr.us-east-1.amazonaws.com"Thay vì "west". Tôi đã sử dụng " east". Một khi tôi sửa chữa lỗi của mình, tôi đã có thể đẩy hình ảnh thành công.


2

Lệnh docker được đưa ra bởi aws-cli rất ít ...

Khi sử dụng đăng nhập docker, docker sẽ lưu một cặp máy chủ: trong khóa của bạn hoặc tập tin ~ / .docker / config.json

Nếu nó lưu khóa dưới https://7272727.dkr.ecr.us-east-1.amazonaws.comphần tra cứu khóa trong khi ấn sẽ thất bại vì docker sẽ tìm kiếm một máy chủ có tên 7272727.dkr.ecr.us-east-1.amazonaws.comkhông https://7272727.dkr.ecr.us-east-1.amazonaws.com.

Sử dụng lệnh sau để đăng nhập:

eval $(aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's|https://||')

Khi bạn chạy lệnh, bạn sẽ nhận được 'Login Succeeded'thông báo và sau đó bạn sẽ ổn
sau khi lệnh đẩy của bạn sẽ hoạt động


2

Có một cách rất đơn giản để đẩy hình ảnh docker sang ECR: Trình trợ giúp xác thực Docker của Amazon ECR . Chỉ cần cài đặt nó theo hướng dẫn được cung cấp, cập nhật ~/.docker/config.jsonnhư sau:

{
    "credsStore": "ecr-login"
}

và bạn sẽ có thể đẩy / kéo hình ảnh của bạn mà không cần docker login.


Tôi đã nhận được lỗi tương tự sau khi làm theo các hướng dẫn trong bài viết này.
ryechus

1

Tôi gặp vấn đề này cũng như chạy trên OSX. Tôi thấy phản hồi của Oliver Salzburg và kiểm tra ~ / .docker / config.json của tôi. Nó có nhiều thông tin ủy quyền bên trong nó từ các tài khoản AWS khác nhau mà tôi có. Tôi đã xóa các tập tin và sau khi chạy lại đăng nhập nó hoạt động.


1

Hãy chắc chắn rằng bạn sử dụng đúng vùng aws ecr get-login, nó phải phù hợp với vùng mà kho lưu trữ của bạn được tạo.


1

Vấn đề của tôi là có nhiều thông tin AWS; mặc định và dev. Vì tôi đã cố gắng triển khai để phát triển nó hoạt động:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')

1

FWIW, Debian 9, Docker phiên bản 18.06.1-ce, bản dựng e68fc7a:

$(aws ecr get-login | sed 's| -e none | |g')


1

Nếu bạn sử dụng nhiều hồ sơ và bạn cần đăng nhập vào hồ sơ không phải là hồ sơ mặc định của mình, bạn cần đăng nhập bằng lệnh này:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)

1

Lệnh sau hoạt động với tôi:

sudo $(aws ecr get-login --region us-east-1 --no-include-email)

Và sau đó tôi chạy các lệnh này:

sudo docker tag e9ae3c220b23(image_id) aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

sudo docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app

0

chúng tôi cũng gặp phải vấn đề này ngày hôm nay và đã thử mọi thứ được đề cập trong bài đăng này (ngoại trừ việc tạo thông tin xác thực AWS).

Cuối cùng chúng tôi đã giải quyết vấn đề bằng cách nâng cấp Docker, sau đó đẩy mạnh.

Vấn đề đã gặp phải với Docker 1.10.x và đã được giải quyết với Docker 1.11.x.

Hi vọng điêu nay co ich


0

Nếu bạn đang cách ly Tài khoản AWS cho mục đích CI / CD và có một kho lưu trữ ECR được chia sẻ giữa nhiều Tài khoản AWS, bạn có thể cần phải thay đổi ~/.docker/config.jsonthủ công.

Giả sử bạn có các thiết lập này:

  1. ECR được sở hữu bởi ID tài khoản AWS 00000000000000
  2. Máy chủ CI được sở hữu bởi ID tài khoản AWS 99999999999999

Nếu bạn gọi aws ecr get-login --region us-west-2 | bashtrong máy chủ CI của mình, docker sẽ tạo thông tin xác thực tạm thời ~/.docker/config.json.

{
  "auths": {
    "https://99999999999999.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Nhưng bạn muốn trỏ đến tài khoản của ECR, vì vậy bạn cần thay đổi tên máy chủ.

{
  "auths": {
    "https://00000000000000.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Lưu ý tình huống này dựa trên cách bạn hình thành người dùng / chính sách IAM để cho phép truy cập ECR.



0
aws ecr get-login --region us-west-1 --no-include-email

Lệnh này cho tôi lệnh chính xác để đăng nhập. Nếu bạn không sử dụng "--no-gộp-email", nó sẽ gây ra lỗi khác. Đầu ra của lệnh trên trông giống như docker này đăng nhập -u AWS -p ********************** rất lớn ******. Sao chép nó và thực hiện nó. Bây giờ nó sẽ hiển thị "Đăng nhập thành công". Bây giờ bạn có thể đẩy hình ảnh của bạn đến ECR.

Đảm bảo rằng quy tắc AMI của bạn có quyền cho người dùng mà bạn đã cố đăng nhập.

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.