डॉकटर कंटेनर को रोकने / न शुरू करने में फ़ाइलों को कैसे संपादित करें


93

कई कंटेनरों में बंटे मेरे आवेदन के साथ त्रुटियों और डिबग समस्याओं को ठीक करने की कोशिश कर रहा हूं, मैं अक्सर कंटेनरों में फ़ाइलों को संपादित करता हूं:

  • या तो मैं पूरी तरह से आलसी हूं और नैनो स्थापित करता हूं और सीधे कंटेनर में संपादित करता हूं या

  • मैं फ़ाइल को कंटेनर से cp करता हूं, इसे संपादित करता हूं, इसे वापस कॉपी करता हूं और कंटेनर को पुनरारंभ करता हूं

कंटेनर निर्माण के लिए नई सामग्री आने से पहले वे मध्यवर्ती चरण होते हैं, जो ऊपर करने की तुलना में बहुत अधिक समय लेता है (जो कि निश्चित रूप से केवल मध्यवर्ती / आस-पास के आस-पास है)।

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

क्या उन कंटेनरों को बचाने का कोई तरीका है? चूंकि वे शुरू नहीं करते हैं, इसलिए मैं उन पर अमल नहीं कर सकता, और इस तरह वे मुझसे हार गए। मैं बिल्ड इनपुट में अपमानजनक फ़ाइल को ठीक करने के बाद आरएम / आरएमआई / बिल्ड / रन रूट पर जाता हूं।

मैं या तो बंद किए गए कंटेनर में फ़ाइलों को कैसे संपादित कर सकता हूं, या उन्हें cp में रोक सकता हूं या बंद कंटेनर में एक शेल शुरू कर सकता हूं - कुछ भी जो मुझे इस कंटेनर को ठीक करने की अनुमति देता है?

(यह एक दूरस्थ कंप्यूटर पर काम करने और नेटवर्किंग कॉन्फ़िगरेशन को तोड़ने जैसा थोड़ा सा लगता है - कनेक्शन इस तरह "हमेशा के लिए" खो जाता है और किसी को एक कमबैक का उपयोग करना पड़ता है, यदि वह मौजूद है।)

होस्ट से डॉकटर कंटेनर फ़ाइलों को कैसे संपादित करें? प्रासंगिक दिखता है लेकिन पुराना है।


यह एक वर्कअराउंड स्टैकओवरफ्लो. com / a/32353134/ 586754 - अभी तक बेहतर समाधान की उम्मीद कर सकता है ।
एंड्रियास रीफ

1
शायद आपको एक वॉल्यूम बढ़ाने पर विचार करना चाहिए ताकि आप कंटेनर के अंदर अपने होस्ट पर फ़ाइलों को संपादित कर सकें। एक बार अपने कोड के साथ खुश होने पर, आप docker cpकंटेनर में फ़ाइलों को मुक्त कर सकते हैं (या एक नई छवि बना सकते हैं)
थॉमसलेविल

हां, यह थोड़ा देर से होगा हालांकि अगर मैंने शुरुआत से ही इस तरह की चीजों को सेट नहीं किया है। यह वसूली के लिए काम नहीं करता है, मुझे लगता है।
एंड्रियास रीफ सेप

बहुत से पाठक केवल फाइलों को संपादित करने के बजाय देखना चाहेंगे । इन मामलों में आप docker commitएक नई छवि को तोड़ने के लिए कमांड का उपयोग कर सकते हैं । name=$(docker commit); docker run -it $name /bin/shजो चाहोगे, करोगे।
16

तो ऐसा लगता है कि रुके हुए कंटेनरों की फाइल सिस्टम अंत में अपेक्षाकृत स्थायी हैं?
वेबवुमन

जवाबों:


138

मेरे पास एक कंटेनर के साथ एक समस्या थी जो एक खराब कॉन्फ़िगरेशन परिवर्तन के कारण शुरू नहीं होगी जो मैंने बनाई थी। मैं रुके हुए कंटेनर में से फ़ाइल को कॉपी करने और उसे संपादित करने में सक्षम था। कुछ इस तरह:

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(फाइल को सही करें)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

22
यह श्लोक स्वीकृत उत्तर है। किसी कारण से मुझे नहीं लगा कि सीपी ने बंद कंटेनरों पर काम किया। अच्छा!
प्रोमेस्सो

उत्तम। मैंने कंटेनर से एक फ़ाइल की प्रतिलिपि बनाई (मुझे इसका रास्ता पता था) और फिर इसे संपादित किया, और फिर उसी स्थान पर कंटेनर में वापस कॉपी किया। मेरे लिए काम किया! धन्यवाद!
नवाज

क्या कोई फ़ाइल निकालने का कोई तरीका है?
कोडलान

1
@kodlan केवल अगर यह केवल UpperDirआप से प्रकट होता है docker container inspect- तो आपको यह देखने के लिए प्रयोग करना होगा कि ओवरले सिस्टम अंतर्निहित संरचना में फ़ाइलों का प्रतिनिधित्व कैसे करता है जिन्हें ऊपरी परत में हटा दिया गया है।
टिम बेवरस्टॉक

धन्यवाद, इससे मुझे अपने MySQL कंटेनर को macOS पर डॉक में चलाने में मदद मिली।
१६ पर सुबह ०६

60

मेरे अपने प्रश्न का उत्तर देना .. अभी भी अधिक जानकार व्यक्ति से बेहतर उत्तर की उम्मीद है !!

2 संभावनाएं हैं।

1) सीधे मेजबान पर फाइल सिस्टम का संपादन । यह कुछ खतरनाक है और कंटेनर को पूरी तरह से तोड़ने का मौका है, संभवतः अन्य डेटा जो गलत हो जाता है, उसके आधार पर।

2) स्टार्टअप स्क्रिप्ट को ऐसी चीज़ में बदलना जो कभी भी बैश शुरू करने, फ़िक्स / एडिट करने और फिर स्टार्टअप प्रोग्राम को फिर से वांछित (जैसे नोड या पहले जो भी हो ) को बदलने में विफल रहता है।

अधिक जानकारी:

1) का उपयोग करना

docker ps

चल रहे कंटेनरों को खोजने के लिए या

docker ps -a

सभी कंटेनरों को खोजने के लिए (बंद किए गए लोगों सहित) और

docker inspect (containername)

पहले मानों में से एक "आईडी" को देखें।

यह वह हिस्सा है जिसमें कार्यान्वयन विवरण होता है और इसमें बदलाव हो सकता है, इस बात से अवगत रहें कि आप अपना कंटेनर इस तरह खो सकते हैं।

के लिए जाओ

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

और वहां आपको वह सभी फाइलें मिलेंगी जो कंटेनर की छवि पर आधारित हैं। आप फ़ाइलों को अधिलेखित कर सकते हैं, फ़ाइलों को जोड़ या संपादित कर सकते हैं।

फिर, मैं इसकी सिफारिश नहीं करूंगा।

2) जैसा कि https://stackoverflow.com/a/32353134/586754 पर वर्णित है, आप कॉन्फ़िगरेशन json config.json को एक पथ पर पा सकते हैं जैसे

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

वहाँ आप उदाहरण के लिए "ndjs app.js" से "/ बिन / बैश" में बदल सकते हैं। अब डॉकटर सेवा को फिर से शुरू करें और कंटेनर शुरू करें (आपको यह देखना चाहिए कि यह अब सही ढंग से शुरू होता है)। आपको उपयोग करना चाहिए

docker start -i (containername)

यह सुनिश्चित करने के लिए कि यह सीधे नहीं छोड़ता है। अब आप कंटेनर के साथ काम कर सकते हैं और / या बाद में संलग्न कर सकते हैं

docker exec -ti (containername) /bin/bash

इसके अलावा, कंटेनर के बाहर संपादित की गई फ़ाइलों की प्रतिलिपि बनाने के लिए docker cp उपयोगी है।

इसके अलावा, किसी को केवल उन उपायों पर वापस जाना चाहिए, अगर कंटेनर कम या ज्यादा "खो" गया है, इसलिए किसी भी बदलाव में सुधार होगा।


फिर भी बेहतर जवाब की उम्मीद है - इसलिए बेझिझक एक दे दो, मैं "asered" टैग को भी स्थानांतरित कर दूंगा।
एंड्रियास रीफ

मैंने दूसरे तरीके का उपयोग किया और मुझे config.jsonहर बार जब मैंने उन्हें संपादित किया तो फाइलों की ओवरराइटिंग के लिए मजबूर करने के लिए docker सेवा को फिर से शुरू करना पड़ा
विटाली इसव

2
मेरे पास config.v2.json है और हर बार जब मैं ज़ोंबी कंटेनर शुरू करता हूं, तो यह मेरे पाथ / एंट्रीपॉइंट अपडेट को पुनः प्राप्त करता है और एक बार फिर से मर जाता है। एंट्रीपॉइंट को अपडेट करने के लिए "docker cp" का प्रयोग करें। स्क्रिप्ट को बस इसे चलाने के लिए तय किया गया।
कर्टिस यलोप

@CurtisYallop मैं एक ही चीज़ का अनुभव कर रहा हूँ। आपने इसे कैसे हल किया?
ब्रेट मैक्लेन

1
@BrettMcLain मैंने होस्ट पर इसे संपादित करने के बजाय docker cp का उपयोग किया। इस तरह: प्रविष्टि बिंदु स्क्रिप्ट स्थान खोजें: "docker मुआयना कंटेनर_नाम | grep प्रविष्टि"। स्क्रिप्ट प्राप्त करें: "docker cp container_name: /entrypoint.sh//"। (इसे संपादित करें) स्क्रिप्ट को कंटेनर में वापस रखें: "docker cp entrypoint.sh कंटेन_name: /entrypoint.sh"। आप एंट्री पॉइंट रन बैश बना सकते हैं या स्लीप लूप चला सकते हैं "जैसे::; स्लीप 10; किया"। पहली स्क्रिप्ट लाइन को "#! / बिन / बैश" होना चाहिए।
कर्टिस येलोप

9

आप कंटेनर फ़ाइल-सिस्टम को सीधे संपादित कर सकते हैं, लेकिन मुझे नहीं पता कि यह एक अच्छा विचार है। सबसे पहले आपको निर्देशिका का मार्ग ढूंढना होगा जो कंटेनर के लिए रनटाइम रूट के रूप में उपयोग किया जाता है। दौड़ो docker container inspect id/nameUpperDirJSON आउटपुट में कुंजी देखें ।

वह आपकी निर्देशिका है।


निर्देशिका मिली, लेकिन इसमें सभी फाइलें नहीं थीं।
हवाई जहाज

यह OverlayFS है, इसलिए आपकी फ़ाइलों को उन निर्देशिकाओं में से एक में होना चाहिए।
तेजस सराडे

निर्देशिका नाम "अपरदिर" से भिन्न हो सकता है, उदाहरण के लिए, मेरे मामले में यह स्रोत है। लेकिन यह काम किया!
रजनी केवलानी

0

यदि आप एक रुके हुए कंटेनर को पुनः आरंभ करने की कोशिश कर रहे हैं और ग़लतफ़हमी के कारण कंटेनर को बदलने की आवश्यकता है, लेकिन कंटेनर शुरू नहीं हो रहा है तो आप निम्न कार्य कर सकते हैं जो "docker cp" कमांड (पिछले सुझाव के समान) का उपयोग करके काम करता है। यह प्रक्रिया आपको फ़ाइलों को हटाने और आवश्यक अन्य परिवर्तनों को करने देती है। भाग्य के साथ आप नीचे दिए गए चरणों को छोड़ सकते हैं।

  1. प्रविष्टि बिंदु खोजने के लिए docker निरीक्षण का उपयोग करें, (कुछ संस्करणों में पथ का नाम)
  2. डॉकिंग रन चलाने वाले का एक क्लोन बनाएं
  3. Docker exec -ti bash (यदि * nix कंटेनर) का उपयोग करके क्लोन दर्ज करें
  4. हालांकि खोजने के लिए क्लोन द्वारा एंट्रीपॉइंट फ़ाइल स्थान का पता लगाएँ
  5. Docker cp का उपयोग करके पुरानी प्रविष्टि बिंदु स्क्रिप्ट की प्रतिलिपि बनाएँ: "
  6. उदाहरण के लिए एक नया एंट्रीपॉइंट स्क्रिप्ट संशोधित करें या बनाएं

    #!/bin/bash tail -f /etc/hosts

  7. सुनिश्चित करें कि स्क्रिप्ट में निष्पादन अधिकार हैं
  8. Docker cp ./ का उपयोग करके पुराने एंट्रीपॉइंट को बदलें:
  9. प्रारंभ का उपयोग करके पुराने कंटेनर को प्रारंभ करें
  10. फिर से शुरू होने तक 6-9 कदम
  11. कंटेनर में समस्याओं को ठीक करें
  12. यदि आवश्यक हो तो एंट्रीपॉइंट को पुनर्स्थापित करें और आवश्यकतानुसार 6-9 चरण फिर से करें
  13. यदि आवश्यकता हो तो क्लोन निकालें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.