मुझे छवि चलाने के बिना डॉकर छवि से फ़ाइल निकालना पसंद है।
यह docker saveविकल्प मेरे लिए व्यावहारिक रूप से एक व्यवहार्य विकल्प नहीं है क्योंकि यह किसी विशिष्ट फ़ाइल को अन-टार करने के लिए बहुत बड़ी फ़ाइल को सहेज रहा है।
मुझे छवि चलाने के बिना डॉकर छवि से फ़ाइल निकालना पसंद है।
यह docker saveविकल्प मेरे लिए व्यावहारिक रूप से एक व्यवहार्य विकल्प नहीं है क्योंकि यह किसी विशिष्ट फ़ाइल को अन-टार करने के लिए बहुत बड़ी फ़ाइल को सहेज रहा है।
जवाबों:
आप निम्न आदेशों वाली छवि से फ़ाइलें निकाल सकते हैं:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
docker create प्रलेखन के अनुसार , यह कंटेनर नहीं चलाता है:
docker createआदेश निर्दिष्ट छवि पर राईट योग्य कंटेनर स्तर बनाकर उसे निर्दिष्ट कमांड को चलाने के लिए तैयार करता है। कंटेनर आईडी तब मुद्रित किया जाता हैSTDOUT। यहdocker run -dकंटेनर को शुरू नहीं करने के अलावा समान है । फिर आपdocker start <container_id>किसी भी बिंदु पर कंटेनर को शुरू करने के लिए कमांड का उपयोग कर सकते हैं ।
संदर्भ के लिए (मेरा पिछला उत्तर), एक छवि से फ़ाइल निकालने का एक कम कुशल तरीका निम्नलिखित है:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
उपरोक्त में से किसी ने भी मेरे लिए काम नहीं किया। पूर्ण कार्य कमान है:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
उद्धरण के catबिना फ़ाइल नाम के बिना पारित किया जाता है, इसलिए यह नहीं पता है कि क्या दिखाना है। साथ ही कमांड समाप्त होने के बाद कंटेनर को हटाना एक अच्छा विचार है।
अगर मैं गलत नहीं हूँ, तो मेरा मानना है कि docker कंटेनर्स उबंटू के लिए निम्नलिखित डायरेक्टरी में बनाई गई कैश्ड फाइलों को स्टोर करते हैं:
/var/lib/docker/aufs/diff/<container_id>
वहां से आपको फ़ाइल सिस्टम तक पहुंचने में सक्षम होना चाहिए और अपनी फ़ाइल को पुनर्प्राप्त करना चाहिए।
layersizeऔर json, और उपयोगकर्ता पढ़ने योग्य भी नहीं है (भले ही उपयोगकर्ता docker समूह में हो)। /var/lib/docker/aufs/diffउस फ़ाइल को सम्मिलित करेंगे, जिसे मैं खोज रहा हूं (लेकिन कंटेनर आईडी द्वारा वर्गीकृत नहीं है) और पठनीय भी नहीं है।
/var/lib/docker/aufs(लेकिन सभी अन्य निर्देशिकाओं में नहीं /var/lib/docker/) का उपयोग कर सकता है
यदि पूर्ण आउटपुट का docker saveविकल्प नहीं है, तो आप इसमें से केवल आवश्यक फ़ाइल निकालने के लिए पाइपलाइनों का उपयोग कर सकते हैं।
दुर्भाग्य से, क्योंकि आउटपुट "टार ऑफ़ टार्स" है, यह थोड़ी पुनरावृत्ति प्रक्रिया हो सकती है।
जब मुझे अभी फाइल निकालने की जरूरत पड़ी तो मैंने क्या किया:
1) यह निर्धारित करें कि जिस फ़ाइल में आप रुचि रखते हैं, उस छवि का कौन सा संस्करण हाल ही में बदला गया है (आप ऐसा कैसे करते हैं यह शायद आपकी छवि पर निर्भर करता है), और वह दिनांक जो इसे बनाया / सहेजा गया था
2) docker saveकमांड के आउटपुट से सामग्री की पूरी तालिका प्राप्त करें :
docker save IMAGE_NAME | tar -tvf -
3) layer.tarउस कमांड के आउटपुट में फ़ाइल (फाइलों ) को ठीक करें जो उस छवि की तारीख से मेल खाती है जिसे आपने चरण 1 में निर्धारित किया था (आप | grep layer.tarकेवल उन फाइलों को दिखाने के लिए जोड़ सकते हैं )
4) उस layer.tarफ़ाइल को मानक से बाहर निकालें , और उसकी सामग्री की तालिका प्राप्त करें:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) आप जिस फ़ाइल को सूचीबद्ध करना चाहते हैं, उसे सत्यापित करें और नाम मिलते ही उसे निकाल दें:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
यदि layer.tarआप चरण 2/3 में देख रहे हैं, तो एक से अधिक फाइलें हैं, तो आपको उनमें से हर एक के लिए चरण 4 को दोहराने की आवश्यकता हो सकती है जब तक कि आपको सही एक न मिल जाए
अपने मामलों के लिए सही छवि के नाम, चेकसम और फ़ाइल नाम के साथ ऊपर के आदेशों में राजधानियों में पाठ को बदलें।