डॉकर कंपोज़ हमेशा कंटेनर को डिपेंडेंसी ऑर्डर में शुरू और बंद करता है, या नहीं दिए जाने पर फ़ाइल में अनुक्रमिक क्रम। लेकिन docker-compose यह गारंटी नहीं देता है कि यह डिपेंडेंसी कंटेनर के चलने तक इंतजार करेगा। आप संदर्भित
कर सकते हैं अधिक जानकारी के लिए यहाँ। तो यहाँ समस्या यह है कि आपका डेटाबेस तैयार नहीं है जब आपका spring-mysql
कंटेनर डेटाबेस तक पहुंचने का प्रयास करता है। तो, अनुशंसित समाधान यह है कि आप का उपयोग कर सकते हैं। वेट-फॉर-इट.श
या आपके spring-mysql
. को लपेटने के लिए समान स्क्रिप्ट ऐप शुरू हो रहा है ENTRYPOINT
।
उदाहरण के लिए यदि आप wait-for-it.sh
. का उपयोग करते हैं आपका ENTRYPOINT
उपरोक्त स्क्रिप्ट को अपने प्रोजेक्ट रूट पर कॉपी करने के बाद आपके डॉकरफाइल में निम्नलिखित में बदलना चाहिए:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
और दो अन्य महत्वपूर्ण बातों पर यहाँ विचार करना है:
- उन लिंक का उपयोग न करें जो वे हैं बहिष्कृत आपको इसके बजाय उपयोगकर्ता-परिभाषित नेटवर्क का उपयोग करना चाहिए। यदि आप किसी भी नेटवर्क को स्पष्ट रूप से परिभाषित नहीं करते हैं, तो docker-compose फ़ाइल में सभी सेवाएँ एकल उपयोगकर्ता-परिभाषित नेटवर्क में होंगी। तो आपको बस कंपोज़ फ़ाइल से लिंक्स को हटाना होगा।
- यदि आप केवल उपयोगकर्ता-परिभाषित नेटवर्क के अंदर ही इसका उपयोग करते हैं, तो आपको डॉकटर कंटेनर के लिए पोर्ट को प्रकाशित करने की आवश्यकता नहीं है।