Anda dapat menggunakan Dockerfile untuk membangun kode sumber menjadi gambar kontainer, lalu mendistribusikan dan menerapkannya. Biasanya, perusahaan membangun gambar kontainer berdasarkan proyek Java di repositori yang dikelola sendiri seperti repositori Maven. Hal ini membuat proses pembuatan gambar lebih kompleks dibandingkan dengan proyek Golang atau Python. Selain itu, kurangnya pemahaman tentang mekanisme caching Dockerfile dapat memperlambat proses pembuatan gambar. Artikel ini menjelaskan cara menggunakan Dockerfile untuk membangun gambar kontainer berdasarkan proyek Java serta cara mempercepat proses tersebut. Artikel ini juga mencakup penggunaan Container Registry Enterprise Edition untuk mengotomatiskan pembuatan gambar. Skenario yang dibahas meliputi basis kode GitLab yang dikelola sendiri dan repositori Maven yang dikelola sendiri di cloud.
Prasyarat
Basis kode GitLab telah dibuat.
Repositori Maven telah dibuat.
Instansi Container Registry Enterprise Edition telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instansi Container Registry Enterprise Edition.
Proyek
Artikel ini menggunakan proyek Java berikut, yang memiliki dependensi:
Provider: Dipanggil oleh proyek Consumer untuk menyediakan layanan.
Modul inti: Menyediakan antarmuka umum.
Modul layanan: Mengimplementasikan layanan.
Consumer: Memanggil layanan Provider.
Modul layanan: Bergantung pada modul Core di proyek Provider. Contoh kode:
. ├── consumer │ ├── Dockerfile │ ├── consumer.iml │ ├── pom.xml │ └── service │ ├── pom.xml │ ├── src │ └── target └── provider ├── Dockerfile ├── core │ ├── pom.xml │ ├── src │ └── target ├── pom.xml ├── provider.iml └── service ├── pom.xml ├── src └── target
Output:
Gambar aplikasi produser dibangun berdasarkan proyek Provider.
Gambar aplikasi konsumen dibangun berdasarkan proyek Consumer.
Langkah 1: Unggah dependensi umum
Sebelum membangun proyek Java, Anda harus mengunggah dependensi umum yang dirujuk oleh proyek ke repositori Maven yang dikelola sendiri. Dalam contoh ini, jalankan perintah unggah berikut di direktori proyek Provider:
mvn clean install org.apache.maven.plugins:maven-deploy-plugin:2.8:deploy -DskipTestsLangkah 2: Buat gambar dasar Maven eksklusif
Untuk mengakses repositori Maven yang dikelola sendiri dalam lingkungan pembuatan berbasis kontainer, Anda harus memasukkan konfigurasi repositori Maven ke dalam gambar dasar Maven. Kami menyarankan Anda membuat gambar dasar Maven publik eksklusif perusahaan berdasarkan gambar Maven resmi. Gambar dasar ini dapat digunakan dalam proyek aplikasi untuk mengakses repositori Maven.
Simpan file berikut sebagai Dockerfile di direktori yang sama dengan file settings.xml di repositori Maven.
FROM maven:3.8-openjdk-8 # Menentukan gambar Maven untuk proyek. Dalam contoh ini, gambar Maven versi 3.8 ditentukan. ADD settings.xml /root/.m2/ # Memasukkan konfigurasi repositori Maven yang dikelola sendiri ke posisi yang sesuai.Jalankan perintah berikut untuk membangun gambar dan mendorongnya ke repositori gambar jarak jauh.
ls Dockerfile settings.xml docker build -t demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 -f Dockerfile . Sending build context to Docker daemon 7.68kB Step 1/2 : FROM maven:3.8-openjdk-8 ---> a3f42bfde036 Step 2/2 : ADD settings.xml /root/.m2/ ---> db0d5a5192e3 Successfully built db0d5a5192e3 Successfully tagged demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 docker push demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8
Langkah 3: Bangun gambar aplikasi Consumer (Lewati langkah ini jika Anda menggunakan proyek Provider)
Jalankan perintah berikut. Kami menyarankan Anda mendorong semua gambar dasar yang diperlukan untuk membangun proyek Consumer ke repositori gambar Alibaba Cloud.
FROM demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 AS builder
# tambahkan pom.xml dan kode sumber
ADD ./pom.xml pom.xml
ADD ./service service/
# kemas jar
RUN mvn clean package
# Tahap kedua: lingkungan runtime minimal
From demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/openjdk:8-jre-alpine
# salin jar dari tahap pertama
COPY --from=builder service/target/service-1.0-SNAPSHOT.jar service-1.0-SNAPSHOT.jar
EXPOSE 8080
CMD ["java", "-jar", "service-1.0-SNAPSHOT.jar"]Langkah 4: Percepat proses pembuatan gambar kontainer berdasarkan proyek Java
Pada Langkah 3: Bangun Gambar Aplikasi Consumer (Lewati langkah ini jika Anda menggunakan proyek Provider), Anda dapat membangun gambar. Namun, paket JAR ditarik ulang setiap kali Anda memodifikasi kode dan mengulangi pembuatan gambar. Ketika cache paket JAR tidak digunakan, proses pembuatan menjadi lambat. Dockerfile memiliki mekanisme caching internal. Setelah Anda memodifikasi kode sumber, konten file dalam perintah ADD diproses menggunakan algoritma hash, sehingga nilai dalam perintah ADD berubah. Akibatnya, perintah RUN harus dibangun ulang, dan hasil cache sebelumnya tidak dapat digunakan. Untuk informasi lebih lanjut, lihat Praktik Terbaik untuk Menulis Dockerfile.
Untuk mempercepat pembuatan gambar, Anda dapat menyimpan cache dan menggunakan kembali dependensi Maven. Lakukan operasi berikut:
Salin file pom.xml proyek ke dalam kontainer dan unduh dependensinya. Dengan cara ini, cache dapat digunakan kembali dalam pembuatan gambar selanjutnya jika hanya file pom.xml yang tidak dimodifikasi.
Salin kode sumber proyek dan kompilasi kode sumber tersebut.
Kode sampel berikut memberikan contoh Dockerfile yang dioptimalkan. Pada pembuatan pertama proyek Java, waktu yang diperlukan adalah 43 detik. Untuk pembuatan berikutnya, waktu yang diperlukan hanya 7 detik jika Anda hanya memodifikasi kode sumber.
FROM demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/maven-base:3.8-openjdk-8 AS builder
# Untuk menyelesaikan dependensi dengan aman (tidak ada pengunduhan ulang saat kode sumber berubah)
ADD ./pom.xml pom.xml
ADD ./service/pom.xml service/pom.xml
RUN mvn install
ADD ./service service/
# kemas jar
RUN mvn clean package
# Tahap kedua: lingkungan runtime minimal
From demo-registry-vpc.cn-beijing.cr.aliyuncs.com/demo/openjdk:8-jre-alpine
# salin jar dari tahap pertama
COPY --from=builder service/target/service-1.0-SNAPSHOT.jar service-1.0-SNAPSHOT.jar
EXPOSE 8080
CMD ["java", "-jar", "service-1.0-SNAPSHOT.jar"]Langkah 5: Otomatiskan pembuatan gambar menggunakan Container Registry Enterprise Edition
Container Registry Enterprise Edition menyediakan kemampuan pembuatan layanan tingkat perusahaan. Kami menyarankan Anda menggunakan Container Registry Enterprise Edition untuk mengotomatiskan pembuatan gambar. Untuk informasi lebih lanjut, lihat Gunakan Instansi Container Registry Enterprise Edition untuk Membangun Gambar.
Bagian berikut menjelaskan beberapa praktik terbaik yang dapat Anda gunakan saat menggunakan instansi Container Registry Enterprise Edition untuk membangun gambar.
Use the VPC mode
Kami menyarankan Anda membungkus kode sumber dalam basis kode GitLab yang dikelola sendiri yang diterapkan di cloud ke dalam gambar kontainer di virtual private cloud (VPC). Dengan cara ini, Anda tidak perlu mengekspos layanan Anda ke Internet. Untuk informasi lebih lanjut, lihat Bangun Gambar Kontainer dalam VPC.
Configure the image tags in the repository to be immutable
Kami menyarankan Anda mengonfigurasi tag gambar di repositori agar tidak dapat diubah untuk mencegah tag online tertimpa.

Create a building rule based on commit IDs
Dua tag gambar dihasilkan setiap kali Anda membangun gambar. Satu tag diwakili menggunakan ID commit kode, yang dipetakan ke versi kode. Tag lainnya diwakili menggunakan latest untuk menunjukkan tag terbaru.

Commit kode akan memicu pembuatan gambar. Gambar berikut menunjukkan dua proses pembuatan yang secara otomatis dipicu setelah kode dicommit dua kali. Dua tag gambar dihasilkan dalam setiap proses pembuatan. Proses pembuatan kedua lebih cepat daripada proses pembuatan pertama karena adanya cache hits.
