डॉकर कंटेनर में शेल करने के बाद मैं किसी फाइल को कैसे संपादित करूं?


516

मैंने सफलतापूर्वक एक डॉकटर कंटेनर का उपयोग किया है:

docker exec -i -t 69f1711a205e bash

अब मुझे फ़ाइल संपादित करने की आवश्यकता है और मेरे अंदर कोई संपादक नहीं है:

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

मैं फ़ाइलों को कैसे संपादित करूं?


@ ओपल मैं संगम / पोस्टग्रेज-बीडब्ल्यू का उपयोग करता हूं: 0.1
इगोर

2
@ ओपल एप-गेट स्थापित विम कार्य। धन्यवाद!
इगोर बैरिनोव

3
तो क्यों नहीं बनाते हैं Dockerfileऔर apt-get install कमांड शामिल करते हैं और अपना कंटेनर जेनरेट करते हैं? डॉकटर कंटेनर को इस तरह से डिज़ाइन किया गया है, न कि आपके तरीके से।
बीएमडब्ल्यू

1
डॉकटर को परीक्षण संपादक पर पट्टे पर स्थापित होना चाहिए, कम से कम डिफ़ॉल्ट रूप से विम
बावनथा

जवाबों:


721

जैसा कि टिप्पणियों में, कोई डिफ़ॉल्ट संपादक सेट नहीं है - अजीब - $EDITORपर्यावरण चर खाली है। आप एक कंटेनर में लॉग इन कर सकते हैं:

docker exec -it <container> bash

और भाग खड़ा हुआ:

apt-get update
apt-get install vim

या निम्नलिखित डॉकरीफाइल का उपयोग करें:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

डॉकर छवियों को नंगे न्यूनतम तक ट्रिम किया जाता है - इसलिए शिप किए गए कंटेनर के साथ कोई संपादक स्थापित नहीं किया जाता है। इसलिए मैन्युअल रूप से इसे स्थापित करने की आवश्यकता है।

संपादित करें

मैं आपको इस विषय के बारे में अपनी पोस्ट पढ़ने के लिए भी प्रोत्साहित करता हूं ।


3
आपको एक वॉल्यूम बढ़ाने
Opal

15
मुझे इसे पूरा करने के लिए एक रूट के रूप में लॉगिन करने की आवश्यकता थी docker exec -u 0 -it container_name bash
Eng.Fouad

34
डॉकटर के साथ, vim-tinyइसके बजाय स्थापित करने के लिए बेहतर है , शायद।
ryenus

2
हो सकता है कि आप अपने द्वारा अटैच किए गए प्रत्येक कंटेनर में एक संपादक को स्थापित न करने पर विचार कर सकते हैं, बल्कि सिर्फ एक बार docker host मशीन पर। जैसा कि अन्य टिप्पणीकारों ने उल्लेख किया है कि आप वॉल्यूम को माउंट कर सकते हैं, इसलिए आप उन फ़ाइलों को संपादित कर सकते हैं जो माउंट होने वाली हैं, या कंटेनर डेटा पर ही नेविगेट करें और फ़ाइलों को संपादित करें/var/lib/docker/
पिट

4
मैं सिर्फ कंटेनर में एक कॉन्फ़िगरेशन को सही से गलत में बदलना चाहता था। apt-getकंटेनर के अंदर अनुमति के मुद्दे के कारण काम नहीं कर रहा था, इसलिए मैंने कोशिश की sed -i 's/texttobechanged/textwanted/g' filename। इसने मेरे लिए काम किया।
अमरेश त्यागी 10

420

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

docker cp <container>:/path/to/file.ext .

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

docker cp file.ext <container>:/path/to/file.ext

पुरानी फ़ाइल को बदलने के लिए।


21
@ आईजीआर यह एक्टुवली स्वीकृत समाधान होना चाहिए क्योंकि यह आपके कंटेनर में अतिरिक्त पैकेजों को जोड़े बिना इसे करने का उचित तरीका है, जबकि पैकेजों को जोड़ना एक माध्यमिक समाधान होना चाहिए।
रॉटिनेटर

1
विंडोज प्लेटफॉर्म के लिए, आप उदाहरण के लिए: docker cp <container>:C:\inetpub\wwwroot\Web.config .और का उपयोग कर सकते हैं docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config
रोसबर्ग लिन्हार्स

1
परीक्षण उद्देश्य के लिए अच्छा समाधान! मैं इसे उत्पादन में करने की सलाह नहीं देता।
मिशाल Micípek

9
और आप उत्पादन के लिए क्या सलाह देते हैं? क्या लोगों को उत्पादन में एक कंटेनर में फ़ाइलों को संपादित करना चाहिए?
lucid_dreamer

4
इस पद्धति पर ध्यान देने योग्य फ़ाइल स्वामित्व बदल जाती है। यह संभव है, लेकिन बाद में इसे रूट ( docker exec -u 0 -it mycontainer bash) के रूप में कंटेनर में जाकर और फिर एक chownकमांड चलाकर इसे थोड़ा बदल दिया जाए ।
स्टीव चेम्बर्स

91

catयदि यह स्थापित है, तो आप इसका उपयोग कर सकते हैं , जो कि नंगे / कच्चे कंटेनर नहीं होने पर सबसे अधिक संभावना होगी। यह एक चुटकी में काम करता है, और जब स्थानीय रूप से एक उचित संपादक को कॉपी + चिपकाना ठीक होता है।

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

catएक नई लाइन प्राप्त करने पर प्रत्येक पंक्ति का उत्पादन करेगा। उस अंतिम पंक्ति के लिए एक नई पंक्ति जोड़ना सुनिश्चित करें। ctrl-c एक भेजता हैSIGINT बिल्ली के लिए इनायत से बाहर निकलने के लिए । टिप्पणियों से आप देखते हैं कि आप एंड-टू-फाइल ("कोई और इनपुट नहीं आ रहा") को दर्शाने के लिए ctrl-d भी मार सकते हैं।

एक अन्य विकल्प कुछ ऐसा है infilterजो कंटेनर नेमस्पेस में एक प्रक्रिया को कुछ ptrace जादू के साथ इंजेक्ट करता है: https://github.com/yadutaf/infilter


3
यह बहुत अविश्वसनीय रूप से उपयोगी है अगर वहाँ टपकाना अनुमति के मुद्दे हैं!
रोमन

17
ctrl+Dसे बेहतर है ctrl+Cctrl+Dभेजता है EOF। आपको अंत में एक अतिरिक्त नई लाइन जोड़ने की आवश्यकता नहीं है। साथ ctrl+Cआप न्यू लाइन को जोड़ने के लिए भूल जाते हैं, आप अंतिम पंक्ति खो देंगे!
वारबैंक

1
@wisbucky अच्छा लगा! और भी बेहतर। हालांकि दो बार ctrl-d की आवश्यकता हो सकती है।

52

अपनी डॉकर छवियों को छोटा रखने के लिए, अनावश्यक संपादकों को स्थापित न करें। आप Docker होस्ट से SSH पर फ़ाइलों को कंटेनर में संपादित कर सकते हैं:

vim scp://remoteuser@containerip//path/to/document

2
धन्यवाद। मैं इस लिंक को छोड़ना चाहता था, जो vim scp:// vim.wikia को बेहतर ढंग से समझाता है । इसके अलावा, अपने कंटेनर का IP पता प्राप्त करने के लिए, आप उपयोग कर सकते हैंsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
बस सोच रहा था, क्या मैं सचमुच "रिमोटस", या "डॉकटर" का उपयोग करता हूं? मैंने कोशिश की है: के vim scp://docker@172.17.0.17//data/gitea/conf/app.iniरूप में अच्छी तरह से vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.iniऔर उन दोनों को एक नया, खाली फ़ाइल बनाने के लिए।
जे। स्कॉट एलबलिन

1
@ J.ScottElblein इसके लिए sshसबसे पहले आपके डॉकटर कन्टेनर को कॉन्फ़िगर करना होगा। Blog.softwaremill.com/… देखें । लेकिन आप आम तौर पर sshअपने कंटेनर में स्थापित नहीं होना चाहते हैं ।
वारबकी

14

कुछ समय बाद आपको पहले कंटेनर को चलाना होगा root:

docker exec -ti --user root <container-id> /bin/bash

फिर कंटेनर में, विम या कुछ और स्थापित करने के लिए:

apt-get install vim

7

मैं "docker run" (न कि "docker exec") का उपयोग करता हूं, और मैं एक प्रतिबंधित क्षेत्र में हूं जहां हम एक संपादक स्थापित नहीं कर सकते। लेकिन मेरे पास डॉकटर होस्ट पर एक संपादक है।

मेरा वर्कअराउंड है: डॉक होस्ट से कंटेनर ( https://docs.docker.com/engine/reference/run/#/volume-sared-filesystems) पर एक वॉल्यूम माउंट करें ) पर करें, और कंटेनर के बाहर फ़ाइल संपादित करें। यह इस तरह दिख रहा है:

docker run -v /outside/dir:/container/dir

यह ज्यादातर प्रयोग करने के लिए है, और बाद में मैं छवि बनाते समय फ़ाइल को बदल दूंगा।



6

आप के साथ मौजूदा फ़ाइल खोल सकते हैं

cat filename.extension

और क्लिपबोर्ड पर सभी मौजूदा पाठ की प्रतिलिपि बनाएँ।

इसके बाद पुरानी फाइल को डिलीट करें

rm filename.extension

या पुरानी फ़ाइल का नाम बदलें

mv old-filename.extension new-filename.extension

के साथ नई फ़ाइल बनाएँ

cat > new-file.extension

फिर क्लिपबोर्ड पर कॉपी किए गए सभी टेक्स्ट को दबाएं, Enterदबाकर सहेजें के साथ बाहर निकलें ctrl+z। और वॉइला को किसी भी प्रकार के संपादकों को स्थापित करने की आवश्यकता नहीं है।


5

आप बस अपनी फ़ाइल को होस्ट पर संपादित कर सकते हैं और जल्दी से इसे कॉपी करके कंटेनर के अंदर चला सकते हैं। यहाँ पायथन फ़ाइल को कॉपी और चलाने के लिए मेरा एक-लाइन शॉर्टकट है:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
कैसे इस सवाल का जवाब देता है? - "मैं फ़ाइलों को कैसे संपादित करूं?"
पीटर मोर्टेंसन

4

आम संपादन कार्यों के लिए मैं स्थापित करना चाहता हूं vi( विम-छोटे ), जो केवल 1491 केबीnano का उपयोग करता है या जो 1707 केबी का उपयोग करता है ।

दूसरे हाथ में 28.9 एमबीvim का उपयोग करता है ।

हमें याद रखना होगा कि apt-get installकाम करने के लिए, हमें updateपहली बार ऐसा करना होगा , इसलिए:

apt-get update
apt-get install vim-tiny

सीएलआई में संपादक शुरू करने के लिए हमें प्रवेश करने की आवश्यकता है vi


2

यदि आप Windows कंटेनर का उपयोग करते हैं और आप किसी भी फ़ाइल को बदलना चाहते हैं, तो आप पॉवर्सशेल कंसोल में Vim को आसानी से प्राप्त और उपयोग कर सकते हैं।

PowerShell के साथ Windows डॉक कंटेनर में जाने के लिए:

docker exec -it <name> powershell

  • पहले Chocolatey पैकेज मैनेजर स्थापित करें

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • विम स्थापित करें

    choco install vim

  • ताज़ा करें ताज़ा संस्करण आप बस exitऔर कंटेनर में वापस खोल सकते हैं

  • फ़ाइल स्थान पर जाएं और उसे विम करें vim file.txt


1

यह एक प्रकार का पेचीदा है, लेकिन एक चुटकी में आप छोटे संपादन कर सकते हैं sedया awkपाठ हटा सकते हैं। अपने regex लक्ष्यों के साथ सावधान रहें और जागरूक रहें कि आप rootअपने कंटेनर में संभावित हैं और अनुमतियों को फिर से समायोजित करना पड़ सकता है।

उदाहरण के लिए, एक पूर्ण रेखा को हटाना जिसमें रेगेक्स से मेल खाते टेक्स्ट होते हैं:

awk '!/targetText/' file.txt > temp && mv temp file.txt

(अधिक)



1

जगह-जगह स्टैक ओवरफ्लो प्रश्न sed एडिट फाइल देखें

यह यहाँ एक अच्छा विकल्प होगा, यदि:

  1. एक बड़ी फ़ाइल को संशोधित करने के लिए, इसका उपयोग करना असंभव है cat
  2. स्थापित करें विम की अनुमति नहीं है या बहुत लंबा है। मेरे स्थिति MySQL 5.7 छवि का उपयोग कर रहा है जब मैं बदलना चाहते हैं my.cnfफ़ाइल के बिना, है vim, viबहुत लंबा है (चीन महान फ़ायरवॉल), और विम स्थापित लेता है। sedछवि में प्रदान किया गया है, और यह काफी सरल है। मेरा उपयोग पसंद है

    sed -i /s/testtobechanged/textwanted/g filename

    man sedअधिक जटिल उपयोग के लिए अन्य ट्यूटोरियल का उपयोग करें या देखें।


1

यदि आप catस्थापित कर सकते हैं, तो >बैक्टीरिया के साथ । यहाँ हेरफेर है:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

अब आप कमांड के साथ परिणाम देख सकते हैं

cat file

0

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

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

आप अपने डेटा को एक डॉकर वॉल्यूम (src_volume) पर बढ़ते हुए संपादित करने में सक्षम होंगे जो आपके डेटा कंटेनर (src_data) और अजगर-विम कंटेनर द्वारा साझा किया जाएगा।

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

इस तरह, आप अपने कंटेनर नहीं बदलते हैं। आप बस इस काम के लिए एक विशेष कंटेनर का उपयोग करें।

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