2015-10-22 6 views
5

मैं डॉकर कंटेनर को रन कमांड के माध्यम से कॉल करने के बाद दो अलग-अलग जेएआर फ़ाइलों को स्वचालित रूप से निष्पादित करना चाहता हूं, इसलिए जब मैं docker run mycontainer टाइप करता हूं तो उन्हें दोनों कहा जाता है। अब तक, मेरे पास ऐसा डॉकरफ़ाइल है जो इस तरह दिखता है:दो डार स्वचालित रूप से "डॉकर रन कंटेनर" पर शुरू होते हैं

# base image is java:8 (ubuntu) 
FROM java:8 

# add files to image 
ADD first.jar . 
ADD second.jar . 

# start on run 
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "first.jar"] 
CMD ["/usr/lib/jvm/java-8-openjdk-amd64/bin/java", "-jar", "second.jar"] 

हालांकि, यह केवल दूसरा शुरू होता है .jar।

अब, दोनों जार एक लूप में सर्वर हैं, इसलिए मुझे लगता है कि एक बार शुरू हो जाने पर यह टर्मिनल को अवरुद्ध करता है। यदि मैं कंटेनर को run -it mycontainer bash का उपयोग करके चलाता हूं और उन्हें मैन्युअल रूप से भी कॉल करता हूं, तो पहला व्यक्ति इसके आउटपुट करेगा और मैं दूसरा शुरू नहीं कर सकता।

क्या अलग-अलग टर्मिनल खोलने और उनके बीच स्विच करने के लिए प्रत्येक जार चलाने के लिए कोई तरीका है? पसंदीदा रूप से पहले से ही dockerfile में।

मैं ubuntu के बारे में कुछ भी नहीं करने के लिए अगले पता, लेकिन मैं xterm आदेश एक नया टर्मिनल खुलती पाया, लेकिन इस एक जार बुला के बाद काम नहीं करेगा। जो मैं खोज रहा हूं वह डॉकरफ़ाइल के अंदर निर्देश हैं जो कि उदाहरण के लिए एक नया टर्मिनल खोलें, पहले टर्मिनल में पहले .jar, alt-tab निष्पादित करें और दूसरा .jar निष्पादित करें, या कम से कम इसे प्राप्त करें।

धन्यवाद!

उत्तर

2

दूसरा सीएमडी अनुदेश पहले बदल देता है, तो आप दोनों आदेशों के लिए एक एकल अनुदेश का उपयोग करने की जरूरत है।

आसान (इतना अच्छा नहीं) दृष्टिकोण

आप एक bash स्क्रिप्ट कि एक दूसरे पर दोनों आदेशों और ब्लॉक निष्पादित करता है जोड़ सकते हैं:

# start.sh 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar first.jar & 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar 

फिर इस के लिए अपने Dockerfile बदलने के लिए:

# base image is java:8 (ubuntu) 
FROM java:8 

# add files to image 
ADD first.jar . 
ADD second.jar . 
ADD start.sh . 

# start on run 
CMD ["bash", "start.sh"] 

docker stop का उपयोग करते समय यह ठीक से बंद नहीं हो सकता है, देखें: https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/

बेहतर दृष्टिकोण

इस का समाधान करने के लिए आप Phusion इस्तेमाल कर सकते हैं: https://hub.docker.com/r/phusion/baseimage/
यह एक init-प्रणाली है कि बहुत उदा से उपयोग करने के लिए आसान है supervisord।दुर्भाग्य से वहाँ आधिकारिक openjdk-8-JDK Ubuntu 14.04 LTS लिए उपलब्ध नहीं है https://github.com/phusion/baseimage-docker#getting_started

Phusion

उपयोग करने के निर्देश:

यहाँ एक अच्छा प्रारंभिक बिंदु है। आप एक अनौपचारिक पीपीए के साथ प्रयास कर सकते हैं, जिसका प्रयोग निम्नलिखित स्पष्टीकरण में किया जाता है। और

# start-first.sh (the file has to start with the following line!): 
#!/bin/bash 
usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar /root/first.jar 

# start-second.sh 
#!/bin/bash 
usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar /root/second.jar 

अपने Dockerfile इस प्रकार दिखाई देगा:

अपने मामले में आप (जो "सेवाओं" की तरह कार्य) लिपियों पार्टी की योजना बनाई करने की आवश्यकता होगी

# base image is phusion 
FROM phusion/baseimage:latest 

# Use init service of phusion 
CMD ["/sbin/my_init"] 

# Install unofficial openjdk-8 
RUN add-apt-repository ppa:openjdk-r/ppa && apt-get update && apt-get dist-upgrade -y && apt-get install -y openjdk-8-jdk 

ADD first.jar /root/first.jar 
ADD second.jar /root/second.jar 

# Add first service 
RUN mkdir /etc/service/first 
ADD start-first.sh /etc/service/first/run 
RUN chmod +x /etc/service/first/run 

# Add second service 
RUN mkdir /etc/service/second 
ADD start-second.sh /etc/service/second/run 
RUN chmod +x /etc/service/second/run 

# Clean up 
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

यह दो सेवाओं स्थापित करना चाहिए जो docker stop का उपयोग करते समय स्टार्टअप पर चलाया जाएगा और ठीक से बंद हो जाएगा।

+0

धन्यवाद, स्क्रिप्ट समाधान मैं वास्तव में क्या ढूंढ रहा था। अब तक समस्याओं के बिना काम करता है! कुछ तोड़ने के मामले में, मैं भी संलयन पर एक नज़र देख रहा हूं। – buggy

+1

सुनकर अच्छा लगा! मैंने एक उदाहरण जोड़ा है कि आप अलग-अलग "सेवाओं" के रूप में दोनों जार शुरू करने के लिए फ़्यूज़न कैसे सेट कर सकते हैं। – craeckie

0

आप एक डोकर कंटेनर (नहीं recommanded व्यवहार) आप supervisord

2

एक डोकर कंटेनर की तरह कुछ का उपयोग कर सकते अंदर दो अलग अलग प्रक्रियाओं प्रारंभ करना चाहते हैं केवल एक ही प्रक्रिया है जब यह शुरू कर दिया गया है।

तुम अब भी कई प्रक्रियाओं बाद में बना सकते हैं .:

  • एक आसान तरीका एक bash स्क्रिप्ट के अंदर एक दूसरी प्रक्रिया तैयार करना है।
  • तुम भी पर्यवेक्षक का उपयोग कर सकते हैं: https://docs.docker.com/articles/using_supervisord/
1

आपके पास कुछ विकल्प हैं। इसके लिए कई उत्तरों ने पर्यवेक्षक का उपयोग करके उल्लेख किया है, जो एक अच्छा समाधान है। यहां कुछ अन्य हैं:

एक छोटी सी स्क्रिप्ट बनाएं जो सिर्फ दोनों जारों को बंद कर दे। इसे अपने सीएमडी में जोड़ें। उदाहरण के लिए, स्क्रिप्ट है, जो हम run_jars.sh फोन करता हूँ दिखाई दे सकता है जैसे:

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar first.jar; 
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar; 

फिर अपने अध्यक्ष एवं प्रबंध निदेशक CMD sh run_jars.sh

एक अन्य विकल्प सिर्फ first.jar के लिए दो अलग-अलग containers-- एक और के लिए अन्य चल रहा है हो सकता है second.jar। आप docker run के माध्यम से हर एक को चला सकते हैं, उदाहरण के लिए:

docker run my_repo/my_image:some_tag /usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar second.jar

+0

विभिन्न कंटेनर सुझाव के लिए धन्यवाद! मैंने इसके साथ खेला और यदि बैश स्क्रिप्ट कार्यान्वयन के दौरान समस्याएं पैदा करती है तो मैं दो कंटेनर पर वापस आ सकता हूं और उन्हें एक दूसरे को कॉल करने के लिए --link कमांड का उपयोग कर सकता हूं। – buggy

संबंधित मुद्दे