Tidak dapat mendorong gambar ke Amazon ECR - gagal dengan "tanpa kredensial auth dasar"

173

Saya mencoba untuk mendorong gambar buruh pelabuhan ke registri Amazon ECR. Saya menggunakan klien buruh pelabuhan Docker versi 1.9.1, build a34a1d5. Saya menggunakan aws ecr get-login --region us-east-1untuk mendapatkan kredibilitas login buruh pelabuhan. Kemudian saya berhasil masuk dengan kredit tersebut sebagai berikut:

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

Tetapi ketika saya mencoba untuk mendorong gambar saya, saya mendapatkan kesalahan berikut:

$ 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

Saya memastikan bahwa pengguna aws memiliki izin yang benar. Saya juga memastikan bahwa repositori memungkinkan pengguna untuk mendorongnya. Hanya untuk memastikan itu bukan masalah saya mengatur registri untuk memungkinkan semua pengguna akses penuh. Tidak ada yang mengubah "no basic auth credentials"kesalahan. Saya tidak tahu bagaimana cara memulai debug ini karena semua lalu lintas dienkripsi.

MEMPERBARUI

Jadi saya memiliki sedikit momen Homer Simpson D'Oh ketika saya menyadari akar penyebab masalah saya. Saya memiliki akses ke beberapa akun AWS. Meskipun saya menggunakan aws configureuntuk mengatur kredensial saya untuk akun di mana saya telah menyiapkan repositori saya aws cli sebenarnya menggunakan variabel lingkungan AWS_ACCESS_KEY_IDdan AWS_SECRET_ACCESS_KEY. Jadi ketika saya melakukannya aws ecr get-loginitu mengembalikan login untuk akun yang salah. Saya gagal memperhatikan bahwa nomor akun berbeda hingga saya baru kembali sekarang untuk mencoba beberapa jawaban yang diajukan. Ketika saya menghapus variabel lingkungan semuanya berfungsi dengan benar. Saya kira moto ceritanya adalah jika Anda menekan kesalahan ini, pastikan bahwa repositori yang Anda masuki cocok dengan tag yang telah Anda terapkan pada gambar.

Alec Rooney
sumber
10
Anda harus membuat pembaruan itu Tebal, digarisbawahi dan dicetak miring. Saya juga baru saja mengalami momen Homer Simpson. Terima kasih!
Mike
Terima kasih telah mempersempitnya! Anda menyelamatkan hari saya secara harfiah!
simonso
2
Kesalahan yang sama diberikan ketika repositori tidak ada. Periksa apakah Anda membuat repo di wilayah yang tepat.
Ilia Sidorenko
Perhatikan bahwa Anda dapat mengatur aws cli Anda untuk menangani beberapa profil pengguna: docs.aws.amazon.com/cli/latest/userguide/…
Peter Berg

Jawaban:

111

jika Anda menjalankannya $(aws ecr get-login --region us-east-1)semua akan dilakukan untuk Anda

Antonio Terreno
sumber
17
Anda seorang legenda. Panduan AWS memiliki 5 langkah semuanya dengan perintah shell kecuali untuk langkah 2, yang hanya mengatakan "Jalankan perintah buruh pelabuhan yang dikembalikan pada langkah sebelumnya." Saya kira banyak orang seperti saya hanya fokus pada perintah shell dan tidak membaca instruksi dengan benar
Tien Dinh
Time machine - Mengapa membungkus perintah aws dalam $ () menyebabkan login berhasil dengan benar?
VtoCorleone
6
@VtoCorleone Karena perintah aws hanya mencetak perintah buruh pelabuhan ke output standar. Jika Anda membungkus string itu dalam $ (), itu akan ditafsirkan oleh shell dan docker loginperintah akan dijalankan.
Otavio Macedo
2
$ (aws ecr get-login --region us-west-2) flag steno tidak dikenal: 'e' in -e Lihat 'buruh pelabuhan login --help'.
Ashish Karpe
23
jika Anda mendapatkan "flag steno tak dikenal: 'e'", Anda harus menjalankan perintah dengan flag --no-include-email seperti ini: $ (aws ecr get-login --region us-east-1 - no-include-email)
Trenton
57

Dalam kasus saya ini adalah bug dengan Docker untuk Windows dan dukungan mereka untuk Windows Credential Manager.

Buka ~/.docker/config.jsondan hapus "credsStore": "wincred"entri.

Ini akan menyebabkan kredensial dituliskan config.jsonsecara langsung. Anda harus masuk lagi setelahnya.

Anda dapat melacak bug ini melalui tiket # 22910 dan # 24968 di GitHub.

Der Hochstapler
sumber
Terima kasih - bekerja pada Windows 10. Setelah menghapus properti itu dari konfigurasi, dan menjalankan perintah login buruh pelabuhan lagi, file konfigurasi diperbarui dengan kredensial, dan push berfungsi.
Cameron
Saya tidak dapat menemukan file konfigurasi. Bisakah Anda memberi tahu saya lokasi file config.json?
Ramashanker Tripathi
@RamashankerTripathi Lokasi ada di jawabannya. Saya tidak yakin bagaimana saya bisa menjadi lebih jelas.
Der Hochstapler
@OliverSalzburg Terima kasih atas balasannya. Sebenarnya direktori instalasi Docker saya tidak mengandung file config.json.
Ramashanker Tripathi
@RamashankerTripathi ~/.dockerberarti .dockerdi direktori home Anda. Coba%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Jika Anda menggunakan profil, jangan lupa untuk lulus --profile=XXXke aws ecr get-login.

Greg
sumber
27

Saya punya masalah ini juga. Apa yang terjadi dengan saya adalah saya lupa menjalankan perintah yang dikembalikan kepada saya setelah saya berlari

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

Perintah ini mengembalikan gumpalan besar, yang termasuk docker loginperintah di sana! Saya tidak sadar. Seharusnya mengembalikan sesuatu seperti ini:

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

Salin dan tempel perintah ini & kemudian jalankan perintah push docker Anda yang terlihat seperti ini:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
James111
sumber
1
Saya tidak tahu apa tanggapan gumpalan itu sehingga saya mengabaikannya. ha ha. Terima kasih telah menunjukkan ini!
duyn9uyen
14

Ini seharusnya bekerja bahkan tanpa membuka izin. Lihat dokumentasi: Otentikasi Pendaftaran Pribadi .

[Sunting: sebenarnya, saya juga memiliki masalah izin saat melakukan tes kedua. Lihat push Docker ke gagal repo pribadi AWS ECR dengan JSON salah format .]

Meskipun demikian saya memiliki masalah yang sama; Saya tidak tahu mengapa, tetapi saya berhasil menggunakan mekanisme auth yang bertele-tele yang dijelaskan dalam dokumen untuk mendapatkan-otorisasi-token

AWS CLI dan versi 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

Dapatkan token autentikasi ('kata sandi docker').

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

Catatan: My ~ / .aws / config menentukan wilayah default yang berbeda, jadi saya perlu mengatur secara eksplisit --region us-east-1.

Masuk secara interaktif (ubah ############ke id akun AWS Anda):

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>

Dorong gambar (dengan asumsi Anda membuat gambar buruh pelabuhan 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
membingungkan
sumber
Bagaimana Anda menempelkan kata sandi yang sangat panjang ??? Milik saya adalah beberapa baris. Saya menggunakan Windows Docker Quickstart Terminal, yang sepertinya tidak memiliki kemampuan salin / tempel yang baik, atau mungkin saya tidak bisa mengetahuinya.
David
Untuk orang lain yang bertanya-tanya, saya hanya perlu menandai dan menyalin semuanya, termasuk spasi, dan kemudian menempelkannya ke Notepad. Dari sana, saya menghapus jeda baris, dan menyalin kembali semuanya, dan hanya kemudian saya bisa menempelkannya ke baris perintah terminal. Itu berhasil.
David
Jika Anda menggunakan PowerShell, buka tab Properties> Options dan pilih "Enable line wrapping selection". Dengan begitu, Anda dapat mengklik dan menarik untuk memilih garis yang dibungkus tanpa harus secara manual menyalin ke Notepad, menghapus baris baru dll.
adarshr
Saya belum menyentuh mesin windows dalam hampir 10 tahun, tetapi Anda selalu bisa mem-pipe stdout ke sebuah file: aws ecr get-authorization-token > config.jsondan kemudian membukanya di editor teks favorit Anda untuk menyalin dan menempel sesuka hati
pcting
13

Coba dengan:

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

sebelum mendorong.

MrMins
sumber
Saya mendapatkan inino basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van
12

Memperbarui

Karena AWS CLI versi 2 - aws ecr get-loginsudah usang dan metode yang benar adalah aws ecr get-login-password.

Karena itu jawaban yang benar dan diperbarui adalah sebagai berikut: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Omry Zobel
sumber
Saya mendapatkanunknown flag: --region
kittu
11

Jika itu membantu siapa pun ...

Masalah saya adalah saya harus menggunakan --profileopsi untuk mengautentikasi dengan profil yang tepat dari file kredensial.

Selanjutnya, saya telah menonaktifkan --region [region_name]perintah, yang juga memberikan kesalahan "tidak ada autentikasi dasar".

Solusi bagi saya adalah mengubah perintah saya dari ini:

aws ecr get-login

Untuk ini:

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

Contoh:

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

Semoga itu bisa membantu seseorang!

Lansana Camara
sumber
1
Kamu menyelamatkanku! Saya menggunakan profil aws saya seperti ini, AWS_PROFILE=myprofile aws ecr get-logindan itu tidak berhasil tetapi memperkenalkan profil aws dengan --profileargumen membuat trik!
Colo Ghidini
8

Ada bug yang dikenal di manajer kredensial yang meringis pada Windows. Menghapus 'https: //' dari perintah login yang dihasilkan menyelesaikan ini.

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

dari pada

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

Lihat juga halaman pemecahan masalah .

Tom Rijntjes
sumber
8

Saya mengalami masalah yang sama.

Menghasilkan kredensial AWS baru (kunci akses) dan mengkonfigurasi ulang AWS CLI dengan kredensial baru menyelesaikan masalah.

Sebelumnya, aws ecr get-login --region us-east-1dihasilkan perintah login buruh pelabuhan dengan URL registri EC yang tidak valid.

temasso
sumber
Hal yang sama terjadi pada saya. Terima kasih!
Greendrake
Ini masalah saya. Saya memiliki kredensial AWS CLI yang berbeda yang disimpan dalam ~ / .aw / kredensial daripada aws yang saya kelola. Menciptakan kredensial dan pengaturan baru yang berfungsi.
Martin Algesten
6

Pada Windows di PowerShell , gunakan:

Invoke-Expression $(aws ecr get-login --no-include-email)
Igor Akkerman
sumber
ini masih relevan
Chappie Johnson
5

Saya memiliki masalah ini dengan penyebab yang berbeda: Saya perlu mendorong ke registri yang tidak terkait dengan Akun AWS saya (registri ECR klien). Klien telah memberi saya akses di bawah tab Izin untuk registri, dengan menambahkan ID IAM saya (misalnya, arn:aws:iam::{AWS ACCT #}:user/{Username}) sebagai Kepala Sekolah. Saya mencoba masuk dengan langkah-langkah biasa:

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

Yang tentu saja menghasilkan no basic auth credentials. Ternyata , aws ecr get-loginAnda masuk ke ECR untuk registri terkait login Anda , yang masuk akal dalam retrospeksi. Solusinya adalah memberi tahu aws ecr get-loginregistri mana yang ingin Anda masuki.

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

Setelah itu, docker pushberfungsi dengan baik.

Jason Clark
sumber
ini masuk akal. Tapi apa yang harus Anda lewati --profile? Saya memiliki akun pribadi tetapi saya mencoba untuk mendorong ke akun perusahaan. Dengan kata lain, di mana saya menemukanprofilename
Ciprian Tomoiag
1
@ CiprianTomoiagă Anda hanya boleh memasukkan itu jika Anda menggunakan profil yang bernama. Lihat di sini docs.aws.amazon.com/cli/latest/userguide/…
Sergio
5
  1. Pastikan Anda telah membuat registri ECR terlebih dahulu.
    Kemudian sesuai dengan Perintah Perintah Dorong ECR, potong dan rekatkan perintah berikut
  2. Jalankan perintah login buruh pelabuhan (eval di Mac / Linux melompati cut-and-paste)
    eval $(aws ecr get-login --region us-east-1)
    tambahkan --profile jika Anda menggunakan beberapa Akun 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

Jika terjadi kesalahan, pastikan Anda menjalankan semua perintah lagi! Kredensial yang Anda gunakan aws ecr get-loginbersifat sementara dan akan kedaluwarsa.

Jason
sumber
di mana saya mencari tahu untuk apa your-profile?
Andy
Anda dapat meninggalkannya jika Anda menggunakan profil default
Jason
Saya mencoba mencari cara untuk tidak menggunakan profil default. Saya menemukan jawabannya, profil tambahan dapat dimasukkan ke dalam ~/.aws/configdan ~/.aws/credentialsfile.
Andy
5

Dalam kasus saya, setelah berjalan aws ecr get-login --no-include-email --region *****, saya hanya menyalin output dari perintah itu dengan bentuk docker login -u *** -p ************, dan Anda menempelkannya di prompt. Dorongan itu berlanjut.

Julien Nyambal
sumber
4

Dokumen AWS memberitahu Anda untuk menjalankan perintah berikut (untuk ap-tenggara-2 wilayah)

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

Ketika saya menabrak masalah ini, tidak jelas bagi saya berdasarkan pada dokumen bahwa Anda perlu memasukkan hasil dari perintah ini ke terminal dan menjalankannya.

Perbaikan yang berhasil bagi saya adalah menyalin hasilnya ke clipboard dengan

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

Rekatkan hasilnya ke baris perintah dan jalankan

Dan Groch
sumber
4

Setelah menjalankan perintah ini:

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

jalankan saja perintah masuk buruh pelabuhan dari output

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

adalah cara buruh pelabuhan itu masuk ke ECR

Javier Rodriguez
sumber
3

Kesalahan ini umumnya dilemparkan jika login ecr gagal. Saya menggunakan sistem windows dan saya menggunakan "Powershell" dalam mode Administrator untuk masuk ke ECR terlebih dahulu.

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

Ini akan menghasilkan "Login berhasil".

kumarras
sumber
Terima kasih! mengapa ini membantu? saya sudah masuk menggunakan saml2aws.
influen
2

Saya menghadapi masalah yang sama dan kesalahan yang saya lakukan adalah menggunakan jalur repo yang salah

misalnya: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

Di jalur di atas, di sinilah saya melakukan kesalahan: Sebagai "dkr.ecr.us-east-1.amazonaws.com"ganti "west". Saya menggunakan " east". Setelah saya memperbaiki kesalahan saya, saya dapat mendorong gambar dengan sukses.

karthik vee
sumber
2

Perintah buruh pelabuhan yang diberikan oleh aws-cli sedikit ...

Saat menggunakan login buruh pelabuhan, buruh pelabuhan akan menyimpan server: pasangan kunci baik di gantungan kunci Anda atau file ~ / .docker / config.json

Jika menyimpan kunci di bawah https://7272727.dkr.ecr.us-east-1.amazonaws.compencarian untuk kunci selama push akan gagal karena buruh pelabuhan akan mencari server bernama 7272727.dkr.ecr.us-east-1.amazonaws.comtidakhttps://7272727.dkr.ecr.us-east-1.amazonaws.com .

Gunakan perintah berikut untuk masuk:

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

Setelah Anda menjalankan perintah Anda akan mendapatkan 'Login Succeeded'pesan dan kemudian Anda baik
setelah itu perintah push Anda akan berfungsi

Dakshin Rajavel
sumber
2

Ada cara yang sangat sederhana untuk mendorong gambar buruh pelabuhan ke ECR: Amazon ECR Docker Credential Helper . Instal saja sesuai dengan panduan yang disediakan, perbarui ~/.docker/config.jsonsebagai berikut:

{
    "credsStore": "ecr-login"
}

dan Anda akan dapat mendorong / menarik gambar Anda tanpa docker login.

Cepr0
sumber
Saya mendapat kesalahan yang sama setelah mengikuti instruksi di artikel ini.
ryechus
1

Saya mengalami masalah ini juga berjalan di OSX. Saya melihat respons Oliver Salzburg dan memeriksa ~ / .docker / config.json saya. Itu memiliki beberapa kredensial otorisasi di dalamnya dari berbagai akun AWS yang saya miliki. Saya menghapus file dan setelah menjalankan get-login lagi berhasil.

Minh Tran
sumber
1

Pastikan Anda menggunakan wilayah yang benar aws ecr get-login, itu harus cocok dengan wilayah tempat repositori Anda dibuat.

Lech Migdal
sumber
1

Masalah saya adalah memiliki beberapa kredensial AWS; default dan dev. Karena saya mencoba untuk menyebarkan ke dev ini bekerja:

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

FWIW, Debian 9, Docker versi 18.06.1-ce, build e68fc7a:

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

Ligemer
sumber
1

Jika Anda menggunakan banyak profil dan Anda harus masuk ke profil yang bukan default Anda, Anda harus masuk dengan perintah ini:

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

Perintah berikut bekerja untuk saya:

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

Lalu saya menjalankan perintah ini:

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
Chirag Kalal
sumber
0

kami juga menghadapi masalah ini hari ini dan mencoba semua yang disebutkan dalam pos ini (kecuali menghasilkan kredensial AWS).

Kami akhirnya memecahkan masalah dengan hanya memutakhirkan Docker, lalu push bekerja.

Masalahnya ditemui dengan Docker 1.10.x dan diselesaikan dengan Docker 1.11.x.

Semoga ini membantu

Baptiste Gaillard
sumber
0

Jika Anda mengisolasi Akun AWS untuk tujuan CI / CD dan memiliki satu repositori ECR yang dibagikan di antara beberapa Akun AWS, Anda mungkin perlu mengubah ~/.docker/config.json secara manual.

Katakanlah Anda memiliki pengaturan ini:

  1. ECR dimiliki oleh ID Akun AWS 00000000000000
  2. Server CI dimiliki oleh ID Akun AWS 99999999999999

Jika Anda menelepon aws ecr get-login --region us-west-2 | bashdalam server CI Anda, buruh pelabuhan akan menghasilkan kredensial sementara di ~/.docker/config.json.

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

Tetapi Anda ingin menunjuk ke akun ECR, jadi Anda perlu mengubah nama host.

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

Perhatikan situasi ini bergantung pada bagaimana Anda membentuk pengguna / kebijakan IAM untuk memungkinkan akses ECR.

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

Perintah ini memberi saya perintah yang benar untuk masuk. Jika Anda tidak menggunakan "--tidak-termasuk-email", itu akan menimbulkan kesalahan lain. Output dari perintah di atas terlihat seperti ini buruh pelabuhan login -u AWS -p ********************** ****** sangat besar. Salin itu dan jalankan. Sekarang akan muncul "Login Berhasil". Sekarang Anda dapat mendorong gambar Anda ke ECR.

Pastikan aturan AMI Anda memiliki izin untuk pengguna yang Anda coba masuki.

Omar Faroque Anik
sumber