Dockerfile में एक स्क्रिप्ट चलाएँ


93

मैं अपने डॉकरफाइल में अपनी निर्माण प्रक्रिया के दौरान एक स्क्रिप्ट चलाने की कोशिश कर रहा हूं। लेकिन यह काम नहीं करता है।

मैंने इस तरह से कोशिश की:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

इस तरह से भी:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

और मेरे चलने वाले कंटेनर को भी निष्पादित करें:

docker exec symfony /bin/bash -c "/bootstrap.sh"

कुछ भी काम नहीं लगता।

क्या आपको पता है इसे कैसे किया जाता है?


क्या bootstarp.shनिष्पादन योग्य बिट सेट है?
jwodder

जैसे कि RUN chmod + x /bootstarp.sh?
केविन

2
"काम नहीं करता" के साथ, वास्तव में क्या हो रहा है? क्या इसमें कोई त्रुटि दिखाई देती है? क्या फाइल इमेज के अंदर मौजूद है? यदि आप docker exec -it symfony bashकंटेनर के अंदर हैं, तो क्या आप स्क्रिप्ट को मैन्युअल रूप से चला सकते हैं, और इसकी सामग्री की जांच कर सकते हैं? ( cat bootstarp.sh)?
thaJeztah

इसे आज़माएं: docker exec symfony /bin/bash /bootstarp.shऔर मुझे आउटपुट के बारे में बताएं।
बॉय्नक्स

जवाबों:


128

RUNऔर ENTRYPOINTएक स्क्रिप्ट को निष्पादित करने के दो अलग-अलग तरीके हैं।

RUNइसका मतलब है कि यह एक मध्यवर्ती कंटेनर बनाता है, स्क्रिप्ट चलाता है और एक नए मध्यवर्ती छवि में उस कंटेनर की नई स्थिति को फ्रीज करता है। उसके बाद स्क्रिप्ट नहीं चलेगी: आपकी अंतिम छवि उस स्क्रिप्ट के परिणाम को दर्शाने वाली है।

ENTRYPOINT आपकी छवि का अर्थ है (जिसने अभी तक स्क्रिप्ट निष्पादित नहीं की है) एक कंटेनर बनाएगा, और उस स्क्रिप्ट को चलाएगा।

दोनों ही मामलों में, स्क्रिप्ट को जोड़ने की आवश्यकता है, और RUN chmod +x /bootstrap.shएक अच्छा विचार है।

यह भी एक शेबंग के साथ शुरू होना चाहिए (जैसे #!/bin/sh)

आपकी स्क्रिप्ट को ध्यान में रखते हुए ( bootstarp.sh: एक दो git config --globalकमांड), यह RUNउस स्क्रिप्ट में एक बार आपके लिए सबसे अच्छा होगा Dockerfile, लेकिन सही उपयोगकर्ता (वैश्विक git configफ़ाइल %HOME%/.gitconfigजो डिफ़ॉल्ट रूप से /rootएक है) का उपयोग करना सुनिश्चित करें

अपने Dockerfile में जोड़ें:

RUN /bootstart.sh

फिर, कंटेनर /root/.gitconfigचलाते समय, स्क्रिप्ट चलाने की पुष्टि करने के लिए सामग्री की जाँच करें ।


5
इसके अलावा, आप का मतलब हो सकता है bootstrap.shबजाय bootstarp.shदेखें: stackoverflow.com/a/1254561/6309
VonC

ठंडा! RUN /bootstrap.sh
केविन

1
पहली लाइन पर शेबंग ने मेरे लिए किया, धन्यवाद! :)
GDICommander

33

उपरोक्त उत्तरों के अतिरिक्त:

यदि आपने अपनी .sh स्क्रिप्ट फ़ाइल को विंडोज में बनाया / संपादित किया है, तो सुनिश्चित करें कि इसे यूनिक्स प्रारूप में लाइन समाप्त होने से बचाया गया था । डिफ़ॉल्ट रूप से विंडोज में कई एडिटर यूनिक्स लाइन एंडिंग को विंडोज फॉर्मेट में बदल देंगे और लिनक्स फाइल की शुरुआत में शेबंग (#! / Bin / sh) को नहीं पहचान सकेगा। तो लिनक्स त्रुटि संदेश का उत्पादन करेगा जैसे कि कोई शेबंग नहीं है।

सुझाव:

  • यदि आप नोटपैड ++ का उपयोग करते हैं, तो आपको "एडिट / ईओएल रूपांतरण / यूनिक्स (एलएफ)" पर क्लिक करना होगा
  • यदि आप विज़ुअल स्टूडियो का उपयोग करते हैं, तो मैं " एंड ऑफ़ लाइन " प्लगइन स्थापित करने का सुझाव दूंगा। फिर आप Ctrl-R, Ctrl-W दबाकर लाइन एंडिंग को दृश्यमान बना सकते हैं। और लिनक्स स्टाइल एंडिंग सेट करने के लिए आप Ctrl-R, Ctrl-L दबा सकते हैं। विंडोज शैली के लिए, Ctrl-R, Ctrl-C दबाएं।

4
वाह, यू ने मेरा दिन बचा लिया। इसके लिए शुक्रिया।
मेगावाट

2
प्रतिभाशाली! यह मेरी बहुत समस्या थी!
केविंसीएल

1
मेरे VSCode ने स्वचालित रूप से विंडोज़ में CRLF के लिए एक शेल स्क्रिप्ट के पंक्तिबद्ध अंत को सेट किया था। कुछ बेतरतीब पात्रों के कारण डॉक निर्माण विफल हो रहा था। मैंने वीएस कोड में सेटिंग्स बदल दी और यह तुरंत काम करना शुरू कर दिया। धन्यवाद! मैंने उत्थान किया है।
आदित्य उपाध्याय

24

ADDवर्किंग डायरेक्टरी की कमांड और स्पेसिफिकेशन के साथ स्क्रिप्ट बनाने की कोशिश करें । इस तरह ("स्क्रिप्ट" स्क्रिप्ट का नाम है और /root/script.shआप कंटेनर में कहां चाहते हैं, यह अलग रास्ता हो सकता है:

ADD script.sh /root/script.sh

इस मामले ADDमें पहले आना होगा CMD, यदि आपके पास एक बीटीडब्ल्यू है, तो यह मेजबान मशीन से कंटेनर में किसी भी स्थान पर स्क्रिप्ट आयात करने का एक अच्छा तरीका है

में CMDजगह[./script]

यह स्वचालित रूप से आपकी स्क्रिप्ट को निष्पादित करना चाहिए

आप यह भी निर्दिष्ट कर सकते हैं WORKDIRके रूप में /rootहै, तो स्वचालित रूप से जड़ में रखा जा you'l, एक कंटेनर को शुरू करते ही


जहां स्क्रिप्ट पहले से ही है, वहां इंडेंट कैसे करता है? मेरा मतलब है, पहला पैरामीटर,script.sh
सूर्यास्त 5

चूंकि आप कंटेनर का निर्माण कर रहे हैं, आप रास्तों के प्रभारी भी हैं
माइकल

पहला परम script.shका मार्ग और नाम सापेक्ष के साथ हैDockerfile
eja

4

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

यहां, मैं scriptsअपनी स्क्रिप्ट को इसमें रखने और इसे चलाने के लिए एक उप-फ़ोल्डर बना रहा हूं :

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.