Mengelola Dockerfile secara dinamis untuk penyewa yang berbeda dalam implementasi pipa CI / CD

13

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

  1. Untuk mengelola perintah titik masuk di dalam Dockerfile dimungkinkan secara dinamis?
  2. 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?

Yakub
sumber
3
Anda dapat menggunakan variabel lingkungan di ENTRYPOINTie Anda ... -Dspring.profiles.active=${TENANT}lalu mengatur lingkungan yang benar selama penyebaran Anda.
masseyb

Jawaban:

13

Mengutip dari 12 Factor - Config

Konfigurasi aplikasi adalah segala sesuatu yang mungkin bervariasi di antara penyebaran (pementasan, produksi, lingkungan pengembang, dll). Ini termasuk:

  • Sumber daya menangani ke basis data, Memcached, dan layanan dukungan lainnya

  • Kredensial untuk layanan eksternal seperti Amazon S3 atau Twitter

  • Nilai per-penyebaran seperti nama host kanonik untuk penggunaan

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

  1. Variabel lingkungan

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/

  1. Pasang konfigurasi profil sebagai konfigurasi dan rujuk

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.

Mohit Mutha
sumber
1
SPRING_PROFILES_ACTIVE sebagai variabel lingkungan harus berfungsi di luar kotak. Tidak perlu untuk parameter tambahan java.
Manuel Polacek
3

Anda dapat menggunakan buruh pelabuhan ARGS, ini hanya akan tersedia pada waktu membangun dan ini dapat digunakan pada titik masuk.

docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .

CONFIG_FILE akan menyimpan lokasi file konfigurasi dan Anda dapat meneruskannya secara dinamis. Ganti titik masuk Anda dengan$CONFIG_FILE

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]
Sivakumar
sumber
ARG CONFIG_FILE - harus dideklarasikan di dalam Dockerfile
Roman M
0

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.

Satish Kumar Nadarajan
sumber