2015-02-12 7 views
24

के लिए डुप्लिकेटिंग डॉकर कंटेनर मेरे पास एक चलने वाला डॉकर कंटेनर है। मैंने चलने वाले डॉकर कंटेनर में कुछ उपयोगी काम किए हैं। मैंने इन कामों को डॉकरफाइल का हिस्सा नहीं किया है, मैंने इसे कंटेनर के अंदर किया है। [उदाहरण: मैंने कंटेनर के अंदर पिंग स्थापित किया है, डॉकर फ़ाइल से नहीं]डीबगिंग

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

तो मैं उस चलने वाले कंटेनर में उपलब्ध सभी चीजों के साथ इसकी एक डुप्लिकेट प्रतिलिपि बनाना चाहता हूं [जैसे कि मैं छवि से कंटेनर बनाना नहीं चाहता और चलने वाले कंटेनर में प्राप्त सभी सफल चरणों को दोहराएं और फिर मेरी डीबगिंग शुरू करें। मैं अपने दूसरे कंटेनर में पिंग फिर से स्थापित नहीं करना चाहता]।

पूरी तरह से, मैं एक कंटेनर को डुप्लिकेट कैसे कर सकता हूं? यदि नहीं तो सभी संभावनाएं क्या हैं?

उत्तर

35
  1. एक आधार छवि बनाएं और इसे

    docker run -it <base_image> /bin/bash 
    
  2. चला सकते हैं
  3. आवश्यक परिवर्तन करें

    yum install ping 
    
  4. यदि आप खुली new_image एक नया नाम

    docker commit <hash tag of running container> new_image 
    

साथ यह कमिट अब

docker run -it new_image /bin/bash 

चलाकर आप देख सकते हैं ping उस में स्थापित किया गया है।

ओपन बेस_इमेज और इसमें ping इंस्टॉल नहीं है।

आशा है कि यह आपके प्रश्न का उत्तर देगा।

+3

दूर बताऊंगा बस थोड़ा सा स्पष्ट करने के लिए: यहां प्रासंगिक आदेश 'डॉकर प्रतिबद्ध' है; शेष ओपी समाप्त होने की स्थिति को फिर से बनाने के लिए बाकी है। – Joost

1

आपको अपने संशोधनों को सहेजना चाहते हैं, तो आप docker commit उपयोग कर सकते हैं, तो दस्तावेज़ http://docs.docker.com/reference/commandline/cli/#commit देख सकते हैं और आप भी, एक कंटेनर को बचाने http://docs.docker.com/reference/commandline/cli/#save

+0

ठीक ठीक है। अगर मैं प्रतिबद्ध करता हूं या सहेजता हूं और फिर मैं अपना डिबगिंग करता हूं, तो क्या मैं वापस अपने सहेजे गए राज्य में वापस आ सकता हूं। क्या यह प्रतिबद्ध होने के बाद से मैं फिर से पुल का उपयोग नहीं करना चाहिए। –

+0

यदि आप प्रतिबद्ध करते हैं, तो आप इसे किसी अन्य नाम से टैग करेंगे, और निश्चित रूप से आप सहेजे गए स्टेटस पर वापस जा सकते हैं (यही वह प्रतिबद्धता है जिसके लिए डिज़ाइन किया गया है)। आपके पास एक और छवि होगी, इसलिए यदि आप इसका उपयोग करना चाहते हैं तो आपको इसे खींचना होगा। अगर आपके पास कैश या स्थानीय रजिस्ट्री है तो पुल लगभग तुरंत हो सकता है। – user2915097

+0

मुझे यह जांचने दें। मैं आपको –

1

डॉकर कार्यान्वयन 1.0.1 (सर्वर/क्लाइंट एपीआई 1.12) के रूप में, रोक/फिर से शुरू करने के संचालन के लिए केवल समर्थन है।

लेकिन जहाँ तक प्रक्रियाओं के snapshotting के रूप में (कॉम में + धक्का) का संबंध है, इन काम नहीं है (समर्थित नहीं है, हालांकि मैं जाँच नहीं किया है प्रलेखन)

सारांश में, 1) के राज्य का संरक्षण चल रही प्रक्रिया संभव नहीं है! 2) फाइल सिस्टम (लगातार भंडारण) में किए जा रहे सभी परिवर्तन सहेजे जा सकते हैं (और प्रतिबद्ध किया जा सकता है + भंडार में धक्का दिया जा सकता है)।

0

वर्तमान में केवल दिसंबर 20 '17 भर से संस्करण के साथ काम करता है नीचे फिर से

टूट।

docker commit एक नई छवि में फ़ाइल परिवर्तनों को सहेजने के लिए ठीक है, लेकिन यह स्मृति, खुले प्रक्रियाओं आदि में परिवर्तनों को संरक्षित नहीं करेगा। लोकप्रिय राय के विपरीत, बाद वाला docker checkpoint के साथ व्यवहार्य है।Documentation और example

नोट: अभी, --checkpoint-dir विकल्प टूटा हुआ है: issue, pull। यही कारण है कि checkpoint_dir (कोड देखें) जैसे कामकाज यहां जरूरी है। यह उत्तर शायद कुछ हफ्तों में अपडेट किया जाना चाहिए।

यह टीटीई चेकपॉइंट करने के लिए not possible है। यह might change जल्द ही। हालांकि, आपexec का उपयोग कर पुनर्स्थापना प्रक्रिया के बाद एक नया TTY संलग्न कर सकते हैं।

आप need to have criu installed। के बाद, पहले,

echo "{\"experimental\": true}" >> /etc/docker/daemon.json 
systemctl restart docker 

, तो

#!/bin/bash 

# tty (-t) not supported 
docker run -i -d --name sleeper\ 
    busybox sh -c 'sleep 10000' 

# Makes a snapshot and stops the container (except if --leave-running is active). --checkpoint-dir is broken. 
docker checkpoint create sleeper cp 
# sleeper container exited 

# Create the clone 
docker create -i --rm --name clone\ 
    busybox 

# Start the clone 
checkpoint_dir="/var/lib/docker/containers/$(docker ps -aq --no-trunc -f name=sleeper)/checkpoints" 
docker start --checkpoint-dir=$checkpoint_dir --checkpoint=cp clone 

# Attach new TTY 
docker exec -it clone sh 
अब tty में

, प्रकार ps -e और आप प्रक्रिया है जिसके sleeper कंटेनर में शुरू कर दिया देख सकते हैं और अब होगा clone में जारी है।

checkpoint मशीनों के बीच परिवर्तनीय हार्ड ड्राइव में कंटेनर का एक पूर्ण ब्लूप्रिंट बनाता है। यह सुविधा criu का उपयोग करती है और प्रयोगात्मक है। Criu create a blueprint of X11 अनुप्रयोगों को मूल रूप से नहीं कर सकता है।

pause दूसरी ओर केवल कंटेनर को आंतरिक रूप से जमा करता है। विरामित किए गए कंटेनर के अलावा आप कुछ भी नहीं कर सकते हैं।

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