Amazon ECR'ye görüntü aktarılamıyor - "temel kimlik doğrulama bilgileri olmadan" başarısız oluyor


174

Bir docker görüntüsünü bir Amazon ECR kayıt defterine aktarmaya çalışıyorum. Docker istemcisi Docker sürüm 1.9.1, build kullanıyorum a34a1d5. aws ecr get-login --region us-east-1Docker giriş kredilerini almak için kullanıyorum . Sonra bu kredilerle başarılı bir şekilde şu şekilde giriş yapıyorum:

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

Ama resmimi itmeye çalıştığımda şu hatayı alıyorum:

$ 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

Aws kullanıcısının doğru izinlere sahip olduğundan emin oldum. Ben de deponun kullanıcının ona itmesine izin verdiğinden emin oldum. Bunun bir sorun olmadığından emin olmak için kayıt defterini tüm kullanıcıların tam erişimine izin verecek şekilde ayarladım. Hiçbir şey "no basic auth credentials"hatayı değiştirmez. Tüm trafik şifreli olduğundan bu hata ayıklamaya nasıl başlayacağımı bilmiyorum.

GÜNCELLEME

Bu yüzden problemimin temel sebebini fark ettiğimde biraz Homer Simpson D'Oh anı yaşadım. Birden fazla AWS hesabına erişimim var. aws configureHavuzumu kurduğum hesap için kimlik bilgilerimi ayarlamak için kullanıyor olmama rağmen , aws cli aslında ortam değişkenlerini AWS_ACCESS_KEY_IDve AWS_SECRET_ACCESS_KEY. Bu yüzden yaptığımda aws ecr get-loginyanlış hesap için bir giriş döndürüyordu. Önerilen yanıtlardan bazılarını denemek için şimdi geri dönene kadar hesap numaralarının farklı olduğunu fark edemedim. Ortam değişkenlerini kaldırdığımda her şey doğru çalışıyor. Sanırım hikayenin sloganı bu hatayı vurursanız, giriş yaptığınız havuzun görüntüye uyguladığınız etiketle eşleştiğinden emin olun.


10
Bu güncellemeyi Kalın, altı çizili ve italik yapmalısınız. Ben de sadece Homer Simpson anını yaşadım. Teşekkür ederim!
Mike

Kısıtladığınız için teşekkürler! Günümü tam anlamıyla kurtardın!
simonso

2
Depo mevcut olmadığında da aynı hata verilir. Repoyu doğru bölgede oluşturup oluşturmadığınızı kontrol edin.
Ilia Sidorenko


Yanıtlar:


111

eğer koşarsan senin $(aws ecr get-login --region us-east-1)için her şey bitecek


17
Sen bir efsanesin. AWS kılavuzunda, yalnızca "önceki adımda döndürülen docker oturum açma komutunu çalıştır" yazan 2. adım dışında bir kabuk komutu ile 5 adım vardı. Kendim gibi bir sürü insanın sadece kabuk komutuna odaklandığını ve talimatı düzgün okumadığını tahmin ediyorum
Tien Dinh

Time machine - Neden aws komutunun $ () içine sarılması, oturum açma işleminin doğru şekilde yapılmasına neden oluyor?
VtoCorleone

6
@VtoCorleone Çünkü aws komutu standart çıktıya sadece bir docker komutu yazdırır. Bu dizgiyi $ () içine sararsanız, kabuk tarafından yorumlanır ve docker loginkomut çalıştırılır.
Otavio Macedo

2
$ (aws ecr get-login --region us-west-2) bilinmeyen stenografi bayrağı: 'e' in -e Bkz. 'docker login --help'.
Ashish Karpe

23
"bilinmeyen stenografi bayrağı: 'e'" alıyorsanız, komutu aşağıdaki gibi --no-include-email bayrağıyla çalıştırmalısınız: $ (aws ecr get-login --region us-east-1 - no-include-email)
Trenton

57

Benim durumumda bu, Windows için Docker ve Windows Kimlik Bilgisi Yöneticisi desteğiyle ilgili bir hataydı.

Girişinizi açın ~/.docker/config.jsonve "credsStore": "wincred"girişi kaldırın .

Bu, kimlik bilgilerinin config.jsondoğrudan yazılmasına neden olur . Daha sonra tekrar giriş yapmanız gerekecek.

Bu hatayı GitHub'daki # 22910 ve # 24968 biletlerinden takip edebilirsiniz .


Teşekkürler - Windows 10'da çalıştı. Bu özelliği config'ten kaldırdıktan ve docker oturum açma komutunu tekrar çalıştırdıktan sonra, config dosyası kimlik bilgileriyle güncellendi ve push push çalıştı.
Cameron

Yapılandırma dosyasını bulamıyorum. Lütfen config.json dosyasının konumunu önerebilir misiniz?
Ramashanker Tripathi

@RamashankerTripathi Konum cevapta. Nasıl daha net olabileceğimden emin değilim.
Der Hochstapler

@OliverSalzburg Yanıtınız için teşekkürler. Aslında Docker kurulum dizinim config.json dosyasını içermiyor.
Ramashanker Tripathi

@RasashankerTripathi , ana dizininizde ~/.dockeranlamına gelir .docker. Deneyin%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler

50

Eğer profil kullanıyorsanız, geçmek unutma --profile=XXXiçin aws ecr get-login.


Get-login'in AWS'den kaldırıldığı bir güncelleme oldu, bunun yerine get-login-password: kullan sudo docker login -u AWS -p $(aws ecr get-login-password --region eu-north-1 --profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com. Varsayılan kimlik bilgileri kullanılıyorsa --profile bayrağını kaldırmayı unutmayın.
Gabriel Petersson

27

Ben de bu sorunu yaşadım. Bana ne oldu, koştuktan sonra bana geri dönen komutu çalıştırmayı unuttum

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

Bu komut, docker loginoradaki komutu içeren büyük bir damla döndürdü ! Farkında değildim. Bunun gibi bir şey döndürmelidir:

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

Bu komutu kopyalayıp yapıştırın ve ardından aşağıdaki gibi görünen docker push komutunuzu çalıştırın:

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

1
Bu leke tepkisinin ne olduğu hakkında hiçbir fikrim yoktu, bu yüzden görmezden geldim. haha. Bunu işaret ettiğiniz için teşekkürler!
duyn9uyen

15

Bu, izinleri açmadan da çalışmış olmalıydı. Özel Kayıt Defteri Kimlik Doğrulaması belgelerine bakın .

[Düzenle: aslında, ikinci bir test yaparken ben de izin sorunları vardı. Bkz. Docker, hatalı biçimlendirilmiş JSON ile başarısız olan AWS ECR özel repo'ya itme ).]

Yine de aynı problemi yaşadım; Nedenini bilmiyorum, ancak belgede alma yetkisi belirteci için daha uzun soluklu kimlik doğrulama mekanizmasını başarıyla kullandım

AWS CLI ve Docker sürümleri:

$ 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

Yetkilendirme jetonunu alın ('docker şifresi').

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

Not: ~ / .aws / config farklı bir varsayılan bölge belirtir, bu yüzden açıkça ayarlamam gerekiyordu --region us-east-1 .

Etkileşimli olarak giriş yapın ( ############AWS hesap kimliğinizle değiştirin):

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>

Bir görüntüyü itin (docker görüntüsü yaptığınızı varsayarak 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

Çok uzun şifreyi nasıl yapıştırdınız ??? Benimki birkaç satır. İyi kopyalama / yapıştırma özelliğine sahip görünmeyen Windows Docker Hızlı Başlangıç ​​Terminalini kullanıyorum veya belki de anlayamıyorum.
David

Merak eden başka birine, boşluk dahil olmak üzere her şeyi işaretleyip kopyalamam ve sonra bunu Not Defteri'ne yapıştırmam gerekiyordu. Oradan, satır sonlarını kaldırırım ve her şeyi yeniden kopyalarım ve ancak o zaman terminal komut satırına yapıştırabilirim. İşe yaradı.
David

PowerShell kullanıyorsanız, Özellikler> Seçenekler sekmesine gidin ve "Satır kaydırma seçimini etkinleştir" i seçin. Bu şekilde, Not Defteri'ne manuel olarak kopyalamak, yeni satırları silmek vb.
Gerekmeden

Neredeyse 10 yıldır bir Windows makinesine dokunmadım, ancak aws ecr get-authorization-token > config.json
stdout'u

13

Şunu deneyin:

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

itmeden önce.


Bunu anladımno basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

13

Güncelleme

AWS CLI sürüm 2 - aws ecr get-loginkullanımdan kaldırıldığından ve doğru yöntemaws ecr get-login-password .

Bu nedenle doğru ve güncellenmiş cevap şudur: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com


I getunknown flag: --region
kittu

@kittu benim için çalışıyor. hangi aws cli sürümünü kullanıyorsunuz?
Omry Zobel

11

Eğer herkese yardım ederse ...

Benim sorunum --profilekimlik bilgileri dosyasından doğru profil ile kimlik doğrulaması için seçeneği kullanmak zorunda oldu .

Sonra, --region [region_name]"temel kimlik doğrulama yok" hatası veren komutu atlatmıştım .

Benim için çözüm bundan emrimi değiştiriyordu:

aws ecr get-login

Buna:

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

Misal:

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

Umarım birine yardım eder!


1
Beni kurtardın! Aws profilimi böyle kullanıyordum AWS_PROFILE=myprofile aws ecr get-loginve işe yaramadı ama aws profilini --profileargümanla tanıtmak hile yapıyor!
Colo Ghidini

8

Windows'taki wincred kimlik bilgisi yöneticisinde bilinen bir hata var. 'Https: //' öğesini oluşturulan giriş komutundan kaldırmak bunu çözer.

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

onun yerine

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

Ayrıca sorun giderme sayfasına bakın .


8

Aynı sorunu yaşadım.

Yeni AWS kimlik bilgileri (erişim anahtarları) oluşturmak ve AWS CLI'yi yeni kimlik bilgileriyle yeniden yapılandırmak sorunu çözdü.

Daha önce, aws ecr get-login --region us-east-1geçersiz EC kayıt defteri URL'si ile oluşturulan docker giriş komutu.


Bana da aynısı oldu. Teşekkürler!
Greendrake

Bu benim sorunumdu. ~ / .Aws / kimlik bilgileri içinde yönettiğim aws'dan farklı bir AWS CLI kimlik bilgim vardı. Yeni kimlik bilgileri ve işe yarayan ortam yeniden oluşturuldu.
Martin Algesten


5

Farklı bir nedenden dolayı bu sorunu yaşadım: AWS Hesabımla ilişkili olmayan bir kayıt defterine (müşterinin ECR kayıt defteri) basmam gerekiyordu. İstemci, IAM kimliğimi (ör. arn:aws:iam::{AWS ACCT #}:user/{Username}) Ana Kişi olarak ekleyerek kayıt defterinin İzinler sekmesi altında bana erişim izni vermişti . Her zamanki adımlarla giriş yapmaya çalıştım:

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

Tabii ki sonuçlandı no basic auth credentials. Sonradan anlaşıldı ki , aws ecr get-loginECR oturumunu açacaktır giriş ilişkili kayıt için geçmişe bakıldığında mantıklı. Çözüm, aws ecr get-loginhangi kayıt defterinde oturum açmak istediğinizi söylemektir .

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

Bundan sonra, docker pushgayet iyi çalışıyor.


Bu mantıklı. Ama neyi geçmelisin --profile? Kişisel bir hesabım var ama bir şirket hesabına geçmeye çalışıyorum. Başka bir deyişle, nerede bulabilirimprofilename
Ciprian Tomoiagă

1
@ CiprianTomoiagă, yalnızca adlandırılmış profiller kullanıyorsanız bunu dahil etmeniz gerekir. Buraya bakın docs.aws.amazon.com/cli/latest/userguide/…
Sergio

5
  1. Önce ECR kayıt defterini oluşturduğunuzdan emin olun.
    Daha sonra ECR Push Komut Talimatlarına göre, aşağıdaki komutları kesin ve yapıştırın

  2. eval $(aws ecr get-login --region us-east-1)
    Birden çok AWS Hesabı kullanıyorsanız docker oturum açma komutunu yürütün (Mac / Linux'ta eval, kes ve yapıştır atlar) add --profile
    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

Hata durumunda, tüm komutları tekrar çalıştırdığınızdan emin olun! Kullandığınız kimlik bilgileriniz aws ecr get-logingeçicidir ve süresi dolar.


ne koyacağımı nereden öğrenebilirim your-profile?
Andy

Varsayılan profili kullanıyorsanız dışarıda bırakabilirsiniz
Jason

Varsayılan profili nasıl kullanılacağını anlamaya çalışıyordum. Yine de anladım, ~/.aws/configve ~/.aws/credentialsdosyalarına ekstra profiller girilebilir .
Andy

5

Benim durumumda, çalıştırdıktan sonra aws ecr get-login --no-include-email --region *****, bu komutun çıktısını şu şekilde kopyaladım:docker login -u *** -p ************ istemine yapıştırın. İtme devam etti.


4

AWS belgeleri size aşağıdaki komutu uygulamanızı söyler (ap-southeast-2 bölgesi için)

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

Bu sorunla karşılaştığımda, bu komutun sonucunu terminale girmeniz ve yürütmeniz gereken dokümanlara dayanarak bana açık değildi.

Benim için çalışan düzeltme sonucu panoya kopyalamaktı

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

Sonucu komut satırına yapıştırın ve yürütün


4

Bu komutu çalıştırdıktan sonra:

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

çıkıştan docker giriş komutunu çalıştırmanız yeterlidir

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

liman işçisinin ECR'ye giriş şekli


3

Bu hata genellikle ecr girişi başarısız olursa atılır. Ben windows sistemi kullanıyorum ve ilk ecr giriş için Yönetici modunda "Powershell" kullandım.

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

Bu "Giriş başarılı" çıktısı vermelidir.


teşekkür ederim! bu neden yardımcı oldu? Zaten saml2aws kullanarak giriş yapıyordum.
akın

2

Aynı sorunla karşılaştım ve yaptığım hata yanlış repo yolunu kullanmaktı

Örneğin: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

Yukarıdaki yolda bu hatayı yaptığım yer: Bunun "dkr.ecr.us-east-1.amazonaws.com"yerine "west". Ben "kullanıyordum east". Ben hatamı düzeltilmiş keresinde başarıyla görüntü itmek başardı.


2

Aws-cli tarafından verilen docker komutu çok az ...

Docker oturum açma özelliğini kullanırken, docker, anahtar zincirinize veya ~ / .docker / config.json dosyasına bir sunucu: anahtar çifti kaydeder

Anahtarı https://7272727.dkr.ecr.us-east-1.amazonaws.com, arama sırasında anahtar aramasının altına kaydederse, docker 7272727.dkr.ecr.us-east-1.amazonaws.comnot adlı bir sunucu arayacağından başarısız olurhttps://7272727.dkr.ecr.us-east-1.amazonaws.com .

Giriş yapmak için aşağıdaki komutu kullanın:

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

Komutu çalıştırdığınızda 'Login Succeeded'mesaj alacaksınız ve bundan
sonra push komutunuzun çalışması iyi olacak


2

Docker görüntülerini ECR'ye aktarmanın çok basit bir yolu var: Amazon ECR Docker Kimlik Bilgisi Yardımcısı . Sadece verilen kılavuza göre yükleyin ~/.docker/config.json, aşağıdaki gibi güncelleyin :

{
    "credsStore": "ecr-login"
}

ve görüntüleri olmadan itebilir / çekebilirsiniz docker login.


Bu makaledeki talimatları uyguladıktan sonra aynı hatayı aldım.
ryechus

1

OSX üzerinde çalışırken de bu sorunla karşılaştım. Oliver Salzburg'un yanıtını gördüm ve ~ / .docker / config.json'umu kontrol ettim. İçinde sahip olduğum farklı AWS hesaplarından birden fazla yetkilendirme bilgisi vardı. Dosyayı sildim ve get-login çalıştırdıktan sonra tekrar çalıştı.


1

Doğru bölgeyi kullandığınızdan emin olun aws ecr get-login; bu, deponuzun oluşturulduğu bölgeyle eşleşmelidir.


1

Benim sorunumda birden fazla AWS kimlik bilgisi vardı; varsayılan ve dev. Ben dev için dağıtmak çalışıyordu beri bu çalıştı:

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

1

FWIW, Debian 9, Docker 18.06.1-ce sürümü, e68fc7a derlemesi:

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


1

Birden çok profil kullanıyorsanız ve varsayılan profiliniz olmayan bir profile giriş yapmanız gerekiyorsa, bu komutla giriş yapmanız gerekir:

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

1

Aşağıdaki komut benim için çalışıyor:

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

Ve sonra şu komutları çalıştırıyorum:

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

Bugün bu sorunla da karşılaştık ve bu yayında belirtilen her şeyi denedik (AWS kimlik bilgileri oluşturma hariç).

Sonunda sadece Docker'ı yükselterek sorunu çözdük, sonra itme işe yaradı.

Sorun Docker 1.10.x ile karşılaşıldı ve Docker 1.11.x ile çözüldü.

Bu yardımcı olur umarım


0

AWS Hesaplarını CI / CD amacıyla yalıtıyorsanız ve bir ECR deposunun birden çok AWS Hesabı arasında paylaşılmasını sağlıyorsanız, ~/.docker/config.json manuel .

Diyelim ki şu kurulumlara sahipsiniz:

  1. ECR'nin sahibi AWS Hesap Kimliği 00000000000000
  2. CI sunucusunun sahibi AWS Hesap Kimliği 99999999999999

aws ecr get-login --region us-west-2 | bashCI sunucunuzda arama yaparsanız , docker içinde geçici kimlik bilgileri oluşturur ~/.docker/config.json.

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

Ancak ECR'nin hesabına işaret etmek istersiniz, bu nedenle ana bilgisayar adını değiştirmeniz gerekir.

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

Bu durumun ECR erişimine izin vermek için IAM kullanıcı / ilkesini nasıl oluşturduğunuza bağlı olduğunu unutmayın.



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

Bu komut bana giriş yapmak için doğru komutu veriyor. "--No-include-email" kullanmazsanız, başka bir hata daha gönderir. Yukarıdaki komutun çıktısı bu docker girişine benziyor -u AWS -p ********************** çok büyük ******. Bunu kopyalayın ve yürütün. Şimdi "Giriş Başarılı" mesajını gösterecektir. Artık görüntünüzü ECR'ye aktarabilirsiniz.

AMI kuralınızın giriş yapmaya çalıştığınız kullanıcı için izni olduğundan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.