CI / CD पाइपलाइन कार्यान्वयन में अलग-अलग किरायेदारों के लिए गतिशील रूप से Dockerfile का प्रबंधन करना


13

मैं अपने प्रोजेक्ट के लिए डॉक, कुबेरनेट्स और जेनकिंस का उपयोग करके CI / CD पाइपलाइन को लागू करने की कोशिश कर रहा हूं। मेरा आवेदन बहु-किरायेदार अनुप्रयोग है जिसमें डेटाबेस अनुप्रयोग चर सब कुछ अलग किरायेदार के लिए अलग है।

आवेदन की रणनीति

जब मैं एक डॉकटर छवि का निर्माण कर रहा हूं तो मैं डॉकफाइल का उपयोग कर रहा हूं। और मैं अपने एसवीएन कोड रिपॉजिटरी के अंदर अपना डॉकरफाइल रखता हूं। प्रत्येक किरायेदार के लिए, कोड रिपॉजिटरी समान है। जब मैं एक छवि बना रहा होता हूं, उस समय मुझे अलग-अलग किरायेदार के लिए अलग-अलग चित्र बनाने की आवश्यकता होती है।

डॉकरीफाइल कार्यान्वयन

मेरी डॉक फ़ाइल में मैं निम्नलिखित की तरह प्रवेश बिंदु जोड़ रहा हूँ,

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]

अगर मुझे एक और किरायेदार के लिए डॉकर छवि बनाने की आवश्यकता है, तो जोड़ना होगा
-Dspring.profiles.active=tenant2config

तो डॉकफाइल में एंट्रीपॉइंट गतिशील है।

मेरा भ्रम

  1. डॉकरफाइल के अंदर प्रवेश बिंदु कमान के प्रबंधन के लिए गतिशील रूप से संभव है?
  2. या क्या मुझे एक और किरायेदार के लिए एक और डॉकरफाइल जोड़ने की आवश्यकता है? और अलग-अलग किरायेदार के लिए अलग से डॉक निर्माण कमांड चलाने की आवश्यकता है?

मैं इस समस्या के कार्यान्वयन का एक अच्छा मानक तरीका कैसे पा सकता हूं?


3
आप अपने में एक वातावरण चर का उपयोग कर सकते ENTRYPOINTयानी ... -Dspring.profiles.active=${TENANT}फिर अपने तैनाती के दौरान सही वातावरण की स्थापना की।
मस्सेब

जवाबों:


13

12 फैक्टर से उद्धरण - विन्यास

एक ऐप का कॉन्फिगरेशन वह सब कुछ है जो डिप्लॉयस (स्टेजिंग, प्रोडक्शन, डेवलपर वातावरण आदि) के बीच भिन्न होने की संभावना है। यह भी शामिल है:

  • संसाधन डेटाबेस, मेमकाटेड, और अन्य बैकिंग सेवाओं को संभालता है

  • बाहरी सेवाओं जैसे अमेज़न S3 या Twitter की साख

  • प्रति-परिनियोजन के लिए विहित होस्टनाम जैसे प्रति-परिनियोजित मान

आपको प्रत्येक किरायेदार के लिए अलग डॉकटर छवियां नहीं बनानी चाहिए क्योंकि बाइनरी समान होनी चाहिए और किसी भी रनटाइम कॉन्फ़िगरेशन को पर्यावरण के माध्यम से इंजेक्ट किया जाना चाहिए।

रनटाइम कॉन्फ़िगरेशन को इंजेक्ट करने के लिए विभिन्न विकल्प हैं

  1. पर्यावरण चर

प्रविष्टि में प्रोफ़ाइल को हार्डकोड करने के बजाय एक पर्यावरण चर जोड़ें

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]

फिर कुबेरनेट्स परिनियोजन कॉन्फ़िगरेशन से पर्यावरण चर इंजेक्षन करें संदर्भ देखें https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. प्रोफ़ाइल कॉन्फ़िगरेशन को एक कॉन्फ़िगरेशन के रूप में माउंट करें और इसे देखें

आपका प्रवेश बिंदु जैसा दिखेगा

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] फिर कुबेरनेट विन्यास के रूप में आवश्यक कॉन्फिग फाइल को माउंट करें।

किसी भी तरह से docker छवि से रनटाइम कॉन्फ़िगरेशन को बाहरी करें और इसे परिवेश चर या कॉन्फ़िगरेशन के रूप में परिनियोजन कॉन्फ़िगरेशन के माध्यम से इंजेक्ट करें।


1
SPRING_PROFILES_ACTIVE के रूप में पर्यावरण चर बॉक्स से बाहर काम करना चाहिए। जावा अतिरिक्त पैरामीटर की कोई आवश्यकता नहीं है।
मैनुअल पोलासेक

3

आप docker ARGS का उपयोग कर सकते हैं, यह केवल बिल्ड टाइम पर उपलब्ध होगा और इसका उपयोग एंट्रीपॉइंट पर किया जा सकता है।

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

CONFIG_FILE कॉन्फ़िगरेशन फ़ाइल का स्थान रखेगा और आप इसे गतिशील रूप से पास कर सकते हैं। अपने प्रवेश बिंदु को बदलें$CONFIG_FILE

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]

ARG CONFIG_FILE -
रोमन एम

0

देखें - Dockerfile सर्वश्रेष्ठ अभ्यास

ENTRYPOINT आपको एक निष्पादन योग्य के रूप में चलाने के लिए एक कंटेनर को कॉन्फ़िगर करने में मदद करता है जो रनटाइम पर तर्क ले सकता है

कोई भी डायनेमिक प्रॉपर्टी जिसे आप ओवरराइड करना चाहते हैं, उसी इमेज के साथ रनटाइम पर किया जा सकता है।

आप रनटाइम पर आवश्यक तर्क पारित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.