Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Identifikasi gambar kontainer duplikat secara otomatis saat bermigrasi ke repositori Amazon ECR
Rishabh Yadav dan Rishi Singla, Amazon Web Services
Ringkasan
Pemberitahuan: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan yang sudah ada AWS CodeCommit dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya
Pola ini memberikan solusi otomatis untuk mengidentifikasi apakah gambar yang disimpan di repositori kontainer yang berbeda adalah duplikat. Pemeriksaan ini berguna saat Anda berencana untuk memigrasikan gambar dari repositori kontainer lain ke Amazon Elastic Container Registry (Amazon ECR).
Untuk informasi dasar, pola juga menjelaskan komponen gambar kontainer, seperti image digest, manifes, dan tag. Saat merencanakan migrasi ke Amazon ECR, Anda dapat memutuskan untuk menyinkronkan gambar kontainer di seluruh pendaftar kontainer dengan membandingkan intisari gambar. Sebelum memigrasikan gambar kontainer, Anda perlu memeriksa apakah gambar-gambar ini sudah ada di repositori Amazon ECR untuk mencegah duplikasi. Namun, sulit untuk mendeteksi duplikasi dengan membandingkan intisari gambar, dan ini dapat menyebabkan masalah pada fase migrasi awal. Pola ini membandingkan intisari dari dua gambar serupa yang disimpan dalam pendaftar kontainer yang berbeda dan menjelaskan mengapa intisari bervariasi, untuk membantu Anda membandingkan gambar secara akurat.
Prasyarat dan batasan
Aktif Akun AWS
Akses ke registri publik Amazon ECR
Keakraban dengan yang berikut: Layanan AWS
Arsitektur
Komponen gambar kontainer
Diagram berikut menggambarkan beberapa komponen dari gambar kontainer. Komponen-komponen ini dijelaskan setelah diagram.

Istilah dan definisi
Istilah-istilah berikut didefinisikan dalam Spesifikasi Gambar Open Container Initiative (OCI)
Registry: Layanan untuk penyimpanan dan manajemen gambar.
Klien: Alat yang berkomunikasi dengan pendaftar dan bekerja dengan gambar lokal.
Push: Proses untuk mengunggah gambar ke registri.
Pull: Proses untuk mengunduh gambar dari registri.
Blob: Bentuk biner konten yang disimpan oleh registri dan dapat diatasi dengan intisari.
Indeks: Sebuah konstruksi yang mengidentifikasi beberapa manifes gambar untuk platform komputer yang berbeda (seperti x86-64 atau ARM 64-bit) atau jenis media. Untuk informasi selengkapnya, lihat Spesifikasi Indeks Gambar OCI
. Manifest: Dokumen JSON yang mendefinisikan gambar atau artefak yang diunggah melalui titik akhir manifes. Manifes dapat mereferensikan gumpalan lain dalam repositori dengan menggunakan deskriptor. Untuk informasi selengkapnya, lihat Spesifikasi Manifes Gambar OCI
. Filesystem layer: Pustaka sistem dan dependensi lain untuk sebuah gambar.
Konfigurasi: Gumpalan yang berisi metadata artefak dan direferensikan dalam manifes. Untuk informasi selengkapnya, lihat Spesifikasi Konfigurasi Gambar OCI
. Objek atau artefak: Item konten konseptual yang disimpan sebagai gumpalan dan dikaitkan dengan manifes yang menyertainya dengan konfigurasi.
Digest: Pengidentifikasi unik yang dibuat dari hash kriptografi dari isi manifes. Image digest membantu mengidentifikasi gambar kontainer yang tidak dapat diubah secara unik. Saat Anda menarik gambar dengan menggunakan intisari, Anda akan mengunduh gambar yang sama setiap kali pada sistem operasi atau arsitektur apa pun. Untuk informasi lebih lanjut, lihat Spesifikasi Gambar OCI
. Tag: Pengidentifikasi manifes yang dapat dibaca manusia. Dibandingkan dengan intisari gambar, yang tidak dapat diubah, tag bersifat dinamis. Tag yang menunjuk ke gambar dapat berubah dan berpindah dari satu gambar ke gambar lainnya, meskipun intisari gambar yang mendasarinya tetap sama.
Arsitektur target
Diagram berikut menampilkan arsitektur tingkat tinggi dari solusi yang disediakan oleh pola ini untuk mengidentifikasi gambar kontainer duplikat dengan membandingkan gambar yang disimpan di Amazon ECR dan repositori pribadi.

Alat
Layanan AWS
CloudFormationmembantu Anda menyiapkan AWS sumber daya, menyediakannya dengan cepat dan konsisten, dan mengelolanya sepanjang siklus hidupnya di seluruh Akun AWS dan Wilayah.
AWS CodeBuildadalah layanan build terkelola penuh yang membantu Anda mengkompilasi kode sumber, menjalankan pengujian unit, dan menghasilkan artefak yang siap digunakan.
AWS CodeCommitadalah layanan kontrol versi yang membantu Anda menyimpan dan mengelola repositori Git secara pribadi, tanpa perlu mengelola sistem kontrol sumber Anda sendiri.
AWS CodePipelinemembantu Anda dengan cepat memodelkan dan mengkonfigurasi berbagai tahapan rilis perangkat lunak dan mengotomatiskan langkah-langkah yang diperlukan untuk merilis perubahan perangkat lunak secara terus menerus.
Amazon Elastic Container Registry (Amazon ECR) adalah layanan registri gambar kontainer terkelola yang aman, terukur, dan andal.
Kode
Kode untuk pola ini tersedia di GitHub repositori Solusi otomatis untuk mengidentifikasi gambar kontainer duplikat antar
Praktik terbaik
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Tarik gambar dari repositori publik Amazon ECR. | Dari terminal, jalankan perintah berikut untuk menarik gambar
Ketika gambar telah ditarik ke mesin lokal Anda, Anda akan melihat pull digest berikut, yang mewakili indeks gambar.
| Pengembang aplikasi, AWS DevOps, administrator AWS |
Dorong gambar ke repositori pribadi Amazon ECR. |
| Administrator AWS, AWS DevOps, Pengembang aplikasi |
Tarik gambar yang sama dari repositori pribadi Amazon ECR. |
| Pengembang aplikasi, AWS DevOps, administrator AWS |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Temukan manifes gambar yang disimpan di repositori publik Amazon ECR. | Dari terminal, jalankan perintah berikut untuk menarik manifes gambar
| Administrator AWS, AWS DevOps, Pengembang aplikasi |
Temukan manifes gambar yang disimpan di repositori pribadi Amazon ECR. | Dari terminal, jalankan perintah berikut untuk menarik manifes gambar
| AWS DevOps, administrator sistem AWS, Pengembang aplikasi |
Bandingkan intisari yang ditarik oleh Docker dengan intisari manifes untuk gambar di repositori pribadi Amazon ECR. | Pertanyaan lain adalah mengapa intisari yang disediakan oleh perintah docker pull berbeda dari intisari manifes untuk gambar. Intisari yang digunakan untuk docker pull mewakili intisari manifes gambar, yang disimpan dalam registri. Intisari ini dianggap sebagai root dari rantai hash, karena manifes berisi hash konten yang akan diunduh dan diimpor ke Docker. ID gambar yang digunakan dalam Docker dapat ditemukan dalam manifes ini sebagai Untuk mengonfirmasi informasi ini, Anda dapat membandingkan output dari perintah docker inspect di repositori publik dan pribadi Amazon ECR:
Hasilnya memverifikasi bahwa kedua gambar memiliki intisari ID gambar dan intisari lapisan yang sama. ID: Lapisan: Selain itu, intisari didasarkan pada byte objek yang dikelola secara lokal (file lokal adalah tar dari lapisan gambar kontainer) atau gumpalan yang didorong ke server registri. Namun, ketika Anda mendorong gumpalan ke registri, tar dikompresi dan intisari dihitung dalam file tar terkompresi. Oleh karena itu, perbedaan nilai docker pull digest muncul dari kompresi yang diterapkan di tingkat registri (Amazon ECR private atau public). catatanPenjelasan ini khusus untuk menggunakan klien Docker. Anda tidak akan melihat perilaku ini dengan klien lain seperti nerdctl atau Finch, karena mereka tidak secara otomatis mengompres gambar selama operasi push dan pull. | AWS DevOps, administrator sistem AWS, Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Kloning repositori. | Kloning repositori Github untuk pola ini ke dalam folder lokal:
| Administrator AWS, AWS DevOps |
Siapkan CI/CD pipa. | GitHub Repositori menyertakan
Pipeline akan diatur dengan dua tahap (CodeCommit dan CodeBuild, seperti yang ditunjukkan pada diagram arsitektur) untuk mengidentifikasi gambar di repositori pribadi yang juga ada di repositori publik. Pipeline dikonfigurasi dengan sumber daya berikut:
| Administrator AWS, AWS DevOps |
Isi CodeCommit repositori. | Untuk mengisi CodeCommit repositori, lakukan langkah-langkah ini:
| Administrator AWS, AWS DevOps |
Bersihkan. | Untuk menghindari timbulnya tagihan future, hapus sumber daya dengan mengikuti langkah-langkah berikut:
| Administrator AWS |
Pemecahan Masalah
| Isu | Solusi |
|---|---|
Ketika Anda mencoba untuk mendorong, menarik, atau berinteraksi dengan CodeCommit repositori dari terminal atau baris perintah, Anda diminta untuk memberikan nama pengguna dan kata sandi, dan Anda harus menyediakan kredensi Git untuk pengguna IAM Anda. | Penyebab paling umum untuk kesalahan ini adalah sebagai berikut:
Tergantung pada sistem operasi dan lingkungan lokal Anda, Anda mungkin perlu menginstal pengelola kredensial, mengkonfigurasi pengelola kredensial yang disertakan dalam sistem operasi Anda, atau menyesuaikan lingkungan lokal Anda untuk menggunakan penyimpanan kredensial. Misalnya, jika komputer menjalankan macOS, maka Anda dapat menggunakan utilitas Keychain Access untuk menyimpan kredensial Anda. Jika komputer Anda menjalankan Windows, Anda dapat menggunakan Pengelola Kredensial Git yang diinstal dengan Git untuk Windows. Untuk informasi selengkapnya, lihat Penyetelan untuk pengguna HTTPS yang menggunakan kredensial Git dalam CodeCommit dokumentasi dan Penyimpanan Kredenal |
Anda mengalami kesalahan HTTP 403 atau “tidak ada kredensial autentikasi dasar” saat Anda mendorong gambar ke repositori Amazon ECR. | Anda mungkin menemukan pesan kesalahan ini dari perintah docker push atau docker pull, bahkan jika Anda telah berhasil mengautentikasi ke Docker dengan menggunakan perintah aws ecr. get-login-password Penyebab yang diketahui adalah:
|
Sumber daya terkait
Solusi otomatis untuk mengidentifikasi gambar kontainer duplikat antara repositori (repositori)
GitHub Gambar pribadi di Amazon ECR (dokumentasi Amazon ECR)
AWS::CodePipeline::Pipeline sumber daya (CloudFormation dokumentasi)
Informasi tambahan
Output inspeksi Docker untuk gambar di repositori publik Amazon ECR
[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]
Output inspeksi Docker untuk gambar di repositori pribadi Amazon ECR
[ { "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68", "RepoTags": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest", "public.ecr.aws/amazonlinux/amazonlinux:2018.03" ], "RepoDigests": [ "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02", "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5" ], "Parent": "", "Comment": "", "Created": "2023-02-23T06:20:11.575053226Z", "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c", "ContainerConfig": { "Hostname": "ec7f2fc7d2b6", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.17", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 167436755, "VirtualSize": 167436755, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged", "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff", "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2" ] }, "Metadata": { "LastTagTime": "2023-03-02T10:28:47.142155987Z" } } ]