全部产品
Search
文档中心

Container Registry:Praktik terbaik untuk membangun gambar kontainer berdasarkan proyek Java

更新时间:Jul 02, 2025

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

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 -DskipTests

Langkah 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.

  1. 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.

  2. 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:

  1. 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.

  2. 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 image repository

  • 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.modify build rule

    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.1