Image yang sudah dibangun perlu nama yang rapi sebelum dibagikan, karena nama itulah yang ditulis pada berkas deployment, pada pipeline CI, dan pada perintah docker run. Topik ini membahas format nama lengkap image, jebakan penanda bawaan yang bergerak, konvensi penomoran versi aplikasi, dan perintah docker tag untuk menambah penanda. Contoh di sepanjang topik menggunakan image aplikasi catatan bernama catatan yang tersimpan di penyimpanan image lokal.
Format nama lengkap image#
Nama lengkap image mengikuti format [registry/][namespace/]repositori:tag, dan setiap bagian yang tidak ditulis diisi nilai bawaan oleh daemon. Bagian registry adalah alamat server tempat image disimpan, sedangkan namespace adalah bagian nama yang menunjukkan pemilik repository, wadah untuk satu nama image beserta seluruh versinya. Tag, label teks yang menunjuk satu varian image, ditulis setelah titik dua pada bagian akhir. Tabel berikut membandingkan nama yang ditulis dengan nama lengkap yang sesungguhnya dipakai daemon.
| Nama yang ditulis | Nama lengkapnya | Keterangan |
|---|---|---|
catatan | docker.io/library/catatan:latest | seluruh bagian diisi nilai bawaan |
budi/catatan:1.0.0 | docker.io/budi/catatan:1.0.0 | namespace milik akun pengguna |
localhost:5000/catatan:1.0.0 | localhost:5000/catatan:1.0.0 | registry privat yang disebut eksplisit |
Baris pertama pada tabel memperlihatkan peran namespace library. Apabila nama image ditulis tanpa namespace, daemon menganggapnya milik library, bagian yang menampung image resmi hasil kurasi Docker. Image buatan sendiri tidak dapat masuk ke namespace itu, sehingga sebelum dibagikan, image aplikasi catatan wajib diberi namespace milik akun, misalnya budi. Nama catatan yang polos tetap berguna di komputer lokal, tetapi nama itulah yang perlu dilengkapi sebelum image dapat diunggah ke registry.
Jebakan tag latest#
Tanpa tag yang ditulis, daemon memakai latest, penanda bawaan yang berpindah mengikuti rilis terbaru sebuah repository. Begitu pula saat pembangunan image, nama tanpa tag seperti catatan otomatis dilengkapi menjadi catatan:latest. Karena itu, perintah pada blok berikut sama persis dengan docker pull alpine:latest.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# tanpa tag yang ditulis, daemon memakai latest
docker pull alpineKesalahpahaman yang lazim adalah menganggap latest sebagai nama versi. Tag itu tidak menyimpan catatan versi terbaru yang pernah ada, melainkan sekadar penunjuk yang dipindahkan pemilik repository setiap image baru diterbitkan. Akibatnya, dua operasi pull, proses menarik image dari registry, yang dijalankan pada waktu berbeda dapat menghasilkan isi image yang berbeda, sekalipun perintahnya sama.
Contoh dampaknya mudah dibayangkan. Image dasar yang ditarik dengan latest pada Dockerfile dapat berpindah versi tanpa sepengetahuan tim, sehingga build yang berhasil pekan lalu dapat gagal pekan ini dengan Dockerfile yang persis sama. Error semacam itu sulit dilacak karena penyebabnya tidak tampak pada perubahan kode mana pun.
Konvensi tag versi semantik#
Konvensi yang lazim untuk versi aplikasi adalah semantic versioning, skema penomoran yang membagi versi menjadi tiga bagian, yaitu mayor, minor, dan tambalan. Tag 1.4.2 berarti versi mayor 1, minor 4, dan tambalan 2, dan tag semacam itu menunjuk satu isi image yang tidak pernah berubah. Pemilik image biasanya menerbitkan tag pendek 1.4 dan 1 bersama tag lengkapnya sebagai penunjuk yang selalu berpindah ke versi terbaru pada rentang minor atau mayor masing-masing.
Pilihan antara tag lengkap dan tag pendek merupakan pertimbangan antara kebaruan dan kepastian. Tag 1.4 membuat pembaruan tambalan diterima secara otomatis, tetapi isi yang ditunjuknya dapat berpindah ketika versi 1.4.3 dirilis. Tag 1.4.2 mengunci isi sepenuhnya, sehingga cocok untuk lingkungan yang menuntut hasil yang dapat direproduksi. Aturan praktisnya, tag pendek untuk pengembangan dan tag lengkap untuk penyebaran.
Menambah penanda dengan docker tag#
Perintah docker tag menambahkan penanda baru pada image yang sudah ada tanpa menyalin isinya. Dua perintah berikut memberi image catatan dua nama lengkap baru, dan keduanya tetap menunjuk satu image yang sama. Penanda yang sudah ada tidak terganggu, karena perintah ini hanya menambah penunjuk, bukan menggantinya.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# menambahkan dua penanda pada image yang sama
docker tag catatan budi/catatan:1.0.0
docker tag catatan budi/catatan:1.0Satu image boleh memiliki banyak tag karena tag hanyalah penunjuk menuju image ID yang sama. Daftar tag pada satu repository ditampilkan dengan docker images. Perintah pada blok berikut membatasi daftar pada repository budi/catatan saja.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# menampilkan seluruh tag pada repository budi/catatan
docker images budi/catatanKeluarannya berupa tabel dengan kolom REPOSITORY, TAG, IMAGE ID, CREATED, dan SIZE, dengan satu baris untuk setiap pasangan repository dan tag. Dua baris yang muncul berbagi IMAGE ID yang sama, tanda bahwa kedua nama menunjuk image yang persis sama. Perintah docker tag tidak menyalin layer apa pun, sehingga penambahan penanda selesai seketika tanpa menambah ruang penyimpanan.
Ringkasan#
- Nama lengkap image berformat
[registry/][namespace/]repositori:tag, dan bagian yang tidak ditulis diisidocker.io,library, sertalatest. - latest hanyalah penanda bawaan yang bergerak, bukan nama versi tetap, sehingga tidak cocok untuk deployment yang harus direproduksi.
- Tag
1.4.2mengunci satu versi persis, sedangkan tag pendek1.4dan1menunjuk versi terbaru pada rentangnya dan ikut berpindah. docker tagmenambahkan penunjuk baru pada image yang sama tanpa menyalin isinya, dandocker imagesmenampilkan seluruh pasangan repository dan tag beserta IMAGE ID-nya.
Referensi#
- docker image tag — Docker Docs — Referensi perintah yang menambahkan penanda pada image yang sudah ada.
- docker image tag, bagian description — Docker Docs — Aturan penamaan repository dan tag yang sah pada image Docker.