Skip to content

emka.web.id

Menu
  • Home
  • Indeks Artikel
  • Tutorial
  • Tentang Kami
Menu

Cara Membuat Dockerfile Dari Image yang telah Ada

Posted on July 25, 2022 by Syauqi Wiryahasana
Docker dibuat dengan membangun Dockerfiles. Proses build menjalankan instruksi di Dockerfile untuk membuat lapisan sistem file yang membentuk gambar akhir. Bagaimana jika Anda sudah memiliki gambar? Bisakah Anda mengambil Dockerfile tempat pembuatannya? Dalam artikel ini, kita akan melihat dua metode yang dapat mencapai hal ini. Saat Anda membuat image Docker Anda sendiri, Anda harus menyimpan file Docker Anda sebagai file yang dikontrol versi di repositori sumber Anda. Praktik ini memastikan Anda selalu dapat mengambil instruksi yang digunakan untuk merakit gambar Anda. Terkadang Anda tidak akan memiliki akses ke file Docker. Mungkin Anda menggunakan gambar yang ada di registri publik tetapi memiliki repositori sumber yang tidak dapat diakses. Atau Anda dapat bekerja dengan snapshot gambar yang tidak secara langsung sesuai dengan versi Dockerfile. Dalam kasus ini, Anda memerlukan teknik yang dapat membuat Dockerfile dari gambar di mesin Anda. Docker tidak menawarkan fungsionalitas bawaan untuk mencapai ini. Gambar yang dibangun tidak memiliki hubungan dengan Dockerfile tempat mereka dibuat. Namun, Anda dapat merekayasa balik proses pembuatan untuk menghasilkan perkiraan yang baik dari Dockerfile gambar sesuai permintaan.

Perintah Riwayat Docker

Perintah riwayat buruh pelabuhan mengungkapkan riwayat lapisan suatu gambar. Ini menunjukkan perintah yang digunakan untuk membangun setiap lapisan sistem file yang berurutan, menjadikannya titik awal yang baik saat mereproduksi Dockerfile. Berikut adalah Dockerfile sederhana untuk aplikasi Node.js:
FROM node:16 
COPY app.js . 
RUN app.js --init CMD ["app.js"]
Build image menggunakan docker build:
$ docker build -t node-app:latest .
Sekarang periksa riwayat layer gambar dengan docker history:
$ docker history node-app:latest
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
c06fc21a8eed   8 seconds ago    /bin/sh -c #(nop)  CMD ["app.js"]               0B        
74d58e07103b   8 seconds ago    /bin/sh -c ./app.js --init                      0B        
22ea63ef9389   19 seconds ago   /bin/sh -c #(nop) COPY file:0c0828d0765af4dd...   50B       
424bc28f998d   4 days ago       /bin/sh -c #(nop)  CMD ["node"]                 0B        
<missing>      4 days ago       /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry...   0B        
...
  Riwayat mencakup daftar lengkap lapisan dalam gambar, termasuk yang diwarisi dari gambar dasar node:16. Lapisan diurutkan jadi yang terbaru satu yang pertama. Anda dapat melihat di mana lapisan yang dibuat oleh sampel Dockerfile dimulai berdasarkan waktu pembuatan ow representasi internal Docker dari instruksi COPY dan CMD yang digunakan di Dockerfile. Output riwayat buruh pelabuhan lebih berguna ketika tabel dibatasi hanya untuk menampilkan perintah setiap lapisan. Anda juga dapat menonaktifkan pemotongan untuk melihat perintah lengkap yang terkait dengan setiap lapisan:
$ docker history node-app:latest --format "{{.CreatedBy}}" --no-trunc
/bin/sh -c #(nop)  CMD ["app.js"]
/bin/sh -c ./app.js --init
/bin/sh -c #(nop) COPY file:0c0828d0765af4dd87b893f355e5dff77d6932d452f5681dfb98fd9cf05e8eb1 in . 
/bin/sh -c #(nop)  CMD ["node"]
/bin/sh -c #(nop)  ENTRYPOINT ["docker-entrypoint.sh"]
...
  Dari daftar perintah ini, Anda dapat memperoleh gambaran umum dari langkah-langkah yang diambil untuk merakit gambar. Untuk gambar sederhana seperti ini, ini dapat menjadi informasi yang cukup untuk secara akurat mereproduksi Dockerfile.

Mengotomatiskan Ekstraksi Lapisan dengan Whaler dan Dfimage

Menyalin perintah dari riwayat buruh pelabuhan adalah proses yang melelahkan. Anda juga perlu menghapus /bin/sh -c di awal setiap baris, karena Docker menangani setiap instruksi sebagai komentar Bash tanpa operasi. Untungnya ada alat komunitas yang tersedia yang dapat mengotomatiskan pembuatan Dockerfile dari riwayat lapisan gambar. Untuk tujuan artikel ini, kita akan fokus pada Whaler yang dikemas ke dalam image Docker alpine/dfimage (Dockerfile-from-Image) oleh organisasi Alpine. Menjalankan image dfimage dan memasok tag Docker akan menghasilkan Dockerfile yang dapat digunakan untuk mereproduksi gambar yang direferensikan. Anda harus mengikat soket Docker host Anda ke dalam wadah dfimage sehingga dapat mengakses daftar gambar Anda dan menarik tag jika diperlukan.
$ docker run --rm 
    -v /var/run/docker.sock:/var/run/docker.sock 
    alpine/dfimage node-app:latest

Analyzing node-app:latest
Docker Version: 20.10.13
GraphDriver: overlay2
Environment Variables
|PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|NODE_VERSION=16.14.2
|YARN_VERSION=1.22.18

Image user
|User is root

Dockerfile:
...
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node"]
COPY file:bcbc3d5784a8f1017653685866d30e230cae61d0da13dae32525b784383ac75f in .
    app.js

RUN ./app.js --init
CMD ["app.js"]
  Dockerfile yang dibuat berisi semua yang Anda butuhkan untuk memulai dari awal (sistem file kosong) ke lapisan terakhir dari gambar yang ditentukan. Ini mencakup semua lapisan yang berasal dari gambar dasar. Anda dapat melihat ini dalam instruksi ENTRYPOINT dan CMD pertama dalam contoh output di atas (lapisan gambar dasar lainnya telah dihilangkan demi singkatnya). Dengan pengecualian COPY, instruksi khusus untuk gambar kita cocok dengan apa yang tertulis di Dockerfile asli . Anda sekarang dapat menyalin instruksi ini ke Dockerfile baru, baik menggunakan seluruh keluaran dfimage atau hanya dengan mengambil bagian yang berhubungan dengan gambar akhir. Opsi terakhir hanya mungkin jika Anda mengetahui identitas gambar dasar asli sehingga Anda dapat menambahkan instruksi FROM ke bagian atas file.

Keterbatasan

Dalam banyak kasus, dfimage akan dapat merakit file Docker yang dapat digunakan. Meskipun demikian itu tidak sempurna dan kecocokan yang tepat tidak dijamin. Tingkat perbedaan dibandingkan dengan file Docker asli gambar akan bervariasi tergantung pada instruksi yang digunakan. Tidak semua instruksi ditangkap dalam riwayat lapisan. Yang tidak didukung akan hilang dan Anda tidak dapat menentukan apa itu. Akurasi terbaik diperoleh dengan perintah dan instruksi metadata seperti RUN, ENV, WORKDIR, ENTRYPOINT, dan CMD. Instruksi RUN mungkin masih hilang jika perintahnya tidak menghasilkan perubahan sistem file, artinya tidak ada lapisan gambar baru yang dibuat. Instruksi COPY dan ADD menghadirkan tantangan unik. Riwayat tidak berisi jalur file host yang disalin ke dalam wadah. Anda dapat melihat salinan terjadi tetapi jalur sumber mereferensikan hash file yang disalin ke dalam gambar dari konteks build. Saat Anda mendapatkan tujuan akhir, ini cukup untuk membantu Anda mengetahui apa yang telah disalin dan alasannya. Anda kemudian dapat menggunakan informasi ini untuk menginterpolasi jalur sumber baru ke dalam Dockerfile yang dapat Anda gunakan untuk build mendatang. Dalam kasus lain, memeriksa file di dalam gambar dapat membantu mengungkapkan tujuan penyalinan sehingga Anda dapat menentukan nama file yang bermakna untuk jalur host. Gambar

Kesimpulan

Docker tidak menyertakan cara langsung untuk bekerja mundur ke Dockerfile tempat mereka dibuat. Masih mungkin untuk menyatukan proses pembuatannya. Untuk gambar sederhana dengan sedikit instruksi, Anda sering dapat mengerjakan instruksi secara manual dengan melihat kolom CREATED BY di output perintah docker history. Gambar yang lebih besar dengan proses pembuatan yang lebih kompleks paling baik dianalisis dengan alat seperti dfimage. Ini melakukan kerja keras untuk mengurai keluaran riwayat buruh pelabuhan verbose untuk Anda, menghasilkan Dockerfile baru yang paling cocok dengan upaya rekayasa asli. Reverse yang mungkin tidak sempurna dan beberapa instruksi Dockerfile hilang atau rusak selama proses pembuatan. Akibatnya Anda tidak boleh menganggap Dockerfiles yang dibuat dengan cara ini adalah representasi akurat dari aslinya. Anda mungkin harus membuat beberapa penyesuaian manual untuk instruksi ADD dan COPY juga, menghidupkan kembali jalur file host yang dikonversi untuk membangun referensi konteks. Itulah berita seputar Cara Membuat Dockerfile Dari Gambar yang Ada, semoga bermanfaat. Disadur dari HowToGeek.com.
Seedbacklink

Recent Posts

TENTANG EMKA.WEB>ID

EMKA.WEB.ID adalah blog seputar teknologi informasi, edukasi dan ke-NU-an yang hadir sejak tahun 2011. Kontak: kontak@emka.web.id.

©2024 emka.web.id Proudly powered by wpStatically