2016-11-13 12 views
5

चलिए एक उदाहरण के रूप में व्हेलसे छवियों को लेते हैं। docker history निम्नलिखित पता चलता है:डॉकर: एक छवि से एक परत निकालने

IMAGE    CREATED    CREATED BY          SIZE    COMMENT 
6b362a9f73eb  17 months ago  /bin/sh -C#(nop) ENV PATH=/usr/local/bin:/us 0 B 
<missing>   17 months ago  /bin/sh -c sh install.sh      30.37 kB 
<missing>   17 months ago  /bin/sh -c git reset --hard origin/master  43.27 kB 
<missing>   17 months ago  /bin/sh -C#(nop) WORKDIR /cowsay    0 B 
<missing>   17 months ago  /bin/sh -c git clone https://github.com/moxie 89.9 kB 
<missing>   17 months ago  /bin/sh -c apt-get -y update && apt-get insta 58.58 MB 
<missing>   18 months ago  /bin/sh -C#(nop) CMD ["/bin/bash"]    0 B 
<missing>   18 months ago  /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 
<missing>   18 months ago  /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB 
<missing>   18 months ago  /bin/sh -C#(nop) ADD file:f4d7b4b3402b5c53f2 188.1 MB 

मैं परत है कि ADD file:bla कहते हैं निकालने के लिए चाहते हैं। क्या ऐसा करने के लिए कोई उपकरण/तरीका है?

+0

'निकालने' से आपका क्या मतलब है? –

+0

https://github.com/docker/docker/blob/master/image/spec/v1.md के अनुसार, एक परत एक JSON फ़ाइल है और फ़ाइल सिस्टम में वास्तविक परिवर्तन है। तो आदर्श रूप से निष्कर्षण मुझे – lang2

उत्तर

2

मैं सच में समझ में नहीं आता कि आप "निकालने" द्वारा क्या मतलब है, लेकिन आप छवि के बारे में अधिक जानकारी प्राप्त करना चाहते हैं,

docker inspect <image_name> 

आप फ़ाइल प्राप्त करने के लिए है, तो इस छवि से कंटेनर चलाना चाहते हैं चलाते हैं।

docker export <container_name> > abc.tar 
उसके बाद

, निकालनेabc.tar की कोशिश करो और अपनी फ़ाइल पाते हैं।

+1

दोनों देगा जो मूल रूप से मैं चाहता हूं लेकिन मैं एक परत निर्दिष्ट करने में सक्षम होना चाहता हूं, न कि पूरी चीज। – lang2

4

ऐसा लगता है कि अन्य लोग भी इस सुविधा को पसंद करेंगे, लेकिन दुर्भाग्य से अभी यह अस्तित्व में प्रतीत नहीं होता है।

भी देखें this issue और यहाँ एक related request जो खारिज कर दिया गया।

आप पूरा डोकर (docker save) की बचत और फिर अपने परत के साथ एक टारबॉल निकालने के साथ ठीक कर रहे हैं, तो यह संभव है:

docker run -it <your image> 
# do fancy stuff in the container 
docker commit <your container> foobar # create image from container 
docker history foobar # will show you the layers 
docker save -o foobar.tar foobar # dumps container contents to foobar.tar 

अब foobar.tar अलग अलग समय से फाइल सिस्टम राज्यों में शामिल होंगे।

{"foobar":{"latest":"fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562"}} 

जो संकेत करता है कि नवीनतम परत fdf43... है के साथ एक फ़ाइल repositories इस टारबॉल शो का निरीक्षण करने से मेरे मामले में,। तुम्हें पता है, undocker, जो इस प्रक्रिया स्वचालित के माध्यम से

tar -x fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562/layer.tar -f foobar.tar 

वहाँ एक उपकरण है इस परत की फाइल सिस्टम सामग्री के साथ एक टारबॉल प्राप्त कर सकते हैं, लेकिन मुझे यकीन है कि क्या यह की वर्तमान प्रारूप के साथ काम करेंगे नहीं हूँ सहेजा गया टैर फ़ाइल।

1

इस विशिष्ट मामले में, ऐसा लगता है कि ADD कमांड ने फ़ाइल सिस्टम में मूल छवि को जोड़ा है। आप docker history --no-trunc docker/whalesay चलाते हैं, पूर्ण आदेश है:

/bin/sh -C#(nop) ADD file:f4d7b4b3402b5c53f266bb7fdd7e728493d9a17f9ef20c8cb1b4759b6e66b70f in/

docker history की रिपोर्ट है कि विशेष परत 188MB है। आइए इन परतों को अधिक विस्तार से देखें:

$ docker save docker/whalesay -o whalesay.tar 
$ tar tvf whalesay.tar 

... 
-rw-r--r-- 0/0  197181952 2015-05-25 22:04 cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar 
... 

एक बहुत अच्छे उम्मीदवार की तरह दिखता है! अब आप उस परत को निकाल सकते हैं और फ़ाइलों को खींच सकते हैं।

$ tar xf whalesay.tar cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar 
$ tar xf cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar etc/passwd 

आप एक परत से बाहर एक विशेष फ़ाइल खींच करने के लिए देख रहे हैं, लेकिन आप नहीं जानते कि जो परत हैं, तो आप ऐसा कर सकता है।

$ tar xf whalesay.tar 

अब तुम मिल गया है सभी अलग-अलग .tar फाइल के रूप में परतों: सबसे पहले, सभी परतों को निकालने के। के एक फ़ाइल पता करते हैं:

$ for layer in */layer.tar; do tar -tf $layer | grep docker.cow && echo $layer; done 
usr/local/share/cows/docker.cow 
0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar 
cowsay/cows/docker.cow 
40e8ae7bb4e5b9eaac56f5be7aa614ed50f163020c87ba59e905e01ef0af0a4f/layer.tar 
cowsay/cows/docker.cow 
f9bc8676543761ff3033813257937aeb77e9bc84296eaf025e27fe01643927cf/layer.tar 

अंत में, परत आप चाहते हैं से फ़ाइल निकालने:

$ tar xf 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar \ 
     usr/local/share/cows/docker.cow 

यह वर्तमान निर्देशिका का पूर्ण पथ रिश्तेदार के साथ उस फ़ाइल निकाल देंगे।

$ cat usr/local/share/cows/docker.cow 
## 
## Docker Cow 
## 
$the_cow = <<EOC; 
    $thoughts 
    $thoughts 
     $thoughts  
        ##  .    
       ## ## ##  ==    
      ## ## ## ##  ===    
     /""""""""""""""""\___/ ===   
    ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~/===- ~~~ 
     \\______ o   __/    
     \\ \\  __/    
      \\____\\______/ 
EOC 
संबंधित मुद्दे