Saya mencoba menerapkan pipa CI / CD untuk proyek saya menggunakan Docker, Kubernetes dan Jenkins. Aplikasi saya adalah aplikasi multi-penyewa di mana variabel aplikasi database semuanya berbeda untuk penyewa yang berbeda.
Strategi Aplikasi
Ketika saya membangun gambar buruh pelabuhan saya menggunakan Dockerfile. Dan saya menyimpan Dockerfile saya di dalam repositori kode SVN saya. Untuk setiap penyewa, repositori kode sama. Ketika saya membangun gambar, pada saat itu saya perlu membuat gambar yang berbeda untuk penyewa yang berbeda.
Implementasi Dockerfile
Dalam file buruh pelabuhan saya, saya menambahkan titik masuk seperti berikut,
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]
Jika saya perlu membuat gambar Docker untuk penyewa lain, perlu menambahkan
-Dspring.profiles.active=tenant2config
Jadi titik masuk di Dockerfile dinamis.
Kebingungan saya
- Untuk mengelola perintah titik masuk di dalam Dockerfile dimungkinkan secara dinamis?
- Atau Apakah saya perlu menambahkan Dockerfile lain untuk penyewa lain? Dan perlu menjalankan buruh bangunan membangun perintah secara terpisah untuk penyewa terpisah?
Bagaimana saya bisa menemukan cara standar yang baik untuk implementasi masalah ini?
sumber
ENTRYPOINT
ie Anda... -Dspring.profiles.active=${TENANT}
lalu mengatur lingkungan yang benar selama penyebaran Anda.Jawaban:
Mengutip dari 12 Factor - Config
Anda tidak boleh membuat gambar buruh pelabuhan yang terpisah untuk setiap penyewa karena binernya harus sama dan konfigurasi runtime apa pun harus disuntikkan melalui lingkungan.
Ada beberapa opsi untuk menyuntikkan konfigurasi runtime
Alih-alih hardcoding profil di entrypoint tambahkan variabel lingkungan
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]
Kemudian menyuntikkan variabel lingkungan dari kubernetes konfigurasi penyebaran Rujuk https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
Titik masuk Anda akan terlihat seperti
ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"]
Kemudian pasang file konfigurasi yang diperlukan sebagai konfigurasi kubernet.Apa pun cara mengeksternalkan konfigurasi runtime dari gambar buruh pelabuhan dan menyuntikkannya melalui konfigurasi penyebaran sebagai variabel lingkungan atau konfigurasi.
sumber
Anda dapat menggunakan buruh pelabuhan ARGS, ini hanya akan tersedia pada waktu membangun dan ini dapat digunakan pada titik masuk.
CONFIG_FILE akan menyimpan lokasi file konfigurasi dan Anda dapat meneruskannya secara dinamis. Ganti titik masuk Anda dengan
$CONFIG_FILE
sumber
Lihat - Praktik Terbaik Dockerfile
ENTRYPOINT membantu Anda mengonfigurasi wadah untuk dijalankan sebagai yang dapat dieksekusi yang dapat mengambil argumen saat runtime
Properti dinamis apa pun yang ingin Anda timpa, dapat dilakukan saat runtime dengan gambar yang sama.
Anda bisa memberikan argumen yang diperlukan saat runtime.
sumber