डॉकटर छवि से फ़ाइल निकालें?


24

मुझे छवि चलाने के बिना डॉकर छवि से फ़ाइल निकालना पसंद है।

यह docker saveविकल्प मेरे लिए व्यावहारिक रूप से एक व्यवहार्य विकल्प नहीं है क्योंकि यह किसी विशिष्ट फ़ाइल को अन-टार करने के लिए बहुत बड़ी फ़ाइल को सहेज रहा है।


आप किस डिस्ट्रो का उपयोग कर रहे हैं?
रेकायो

@ryekayo: Ubuntu 14, docker 1.12.4 (एपी 1.24)
BlakBat

जवाबों:


21

आप निम्न आदेशों वाली छवि से फ़ाइलें निकाल सकते हैं:

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

3
आप एंट्रीपॉइंट को ओवर-राइड करना चाह सकते हैं। docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
एंड्रयू

1
यह छवि को चलाता है, जो कि विशेष रूप से वह है जो मैं अपने प्रश्न में कहा नहीं करना चाहता था।
ब्लेकबैट

आह, यह एक अच्छी बात है। मैं मानता हूं कि मेरा वर्तमान उत्तर संतोषजनक नहीं है।
बीबीसी

1
@BlakBat क्या यह अद्यतन उत्तर आपके लिए काम करता है? मुझे लगता है कि मुझे एक नया उत्तर बनाना चाहिए था लेकिन अब ऐसा हो गया है।
bbc

1
@bbc यह अद्यतन उत्तर वास्तव में एक कंटेनर (प्रश्न का क्रूस) शुरू नहीं करता है, और इसे रूट होने की आवश्यकता नहीं है।
ब्लेकबैट

2

उपरोक्त में से किसी ने भी मेरे लिए काम नहीं किया। पूर्ण कार्य कमान है:

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

उद्धरण के catबिना फ़ाइल नाम के बिना पारित किया जाता है, इसलिए यह नहीं पता है कि क्या दिखाना है। साथ ही कमांड समाप्त होने के बाद कंटेनर को हटाना एक अच्छा विचार है।


आप जिस कमांड का उल्लेख कर रहे हैं, वह केवल डॉकटर के आधार पर काम करेगा और कैसे सही ढंग से ENTRYPOINT / CMD को Dockerfile में सेट किया गया था; यह उद्धृत करने से कोई लेना-देना नहीं है। आप कंटेनर को हटाने के लिए भी कहते हैं, फिर भी आप निर्दिष्ट करते हैं --rm। अंत में, जब मैंने अपना प्रश्न पोस्ट किया था, तो मैंने "छवि को चलाने के बिना" निर्दिष्ट किया था और कोई जवाब नहीं था जो इसे ध्यान में रखते हुए एक समाधान था।
ब्लाकबैट

1
भले ही CMD और ENTRYPOINT को Dockerfile में सेट किया गया था लेकिन मैं दोनों को ओवरराइड करता हूं, इसलिए यह हमेशा (निश्चित रूप से लिनक्स पर) काम करेगा। "क्या आप पर निर्भर करता है" से क्या मतलब है? सेटिंग्स, संस्करण, एनवी, क्या? आप सवाल सही नहीं है क्योंकि छवियों को निष्पादित नहीं किया जा सकता है, केवल कंटेनर कर सकते हैं। मुझे लगता है कि कोई सही उत्तर नहीं है, आपको कई फ़ाइलों से निपटना होगा या एक अस्थायी कंटेनर बनाना होगा। --rm अस्थायी कंटेनर को हटाता है, अन्य उत्तर आपकी डिस्क पर कुछ रद्दी छोड़ते हैं।
sekrett

1

अगर मैं गलत नहीं हूँ, तो मेरा मानना ​​है कि docker कंटेनर्स उबंटू के लिए निम्नलिखित डायरेक्टरी में बनाई गई कैश्ड फाइलों को स्टोर करते हैं:

/var/lib/docker/aufs/diff/<container_id>

वहां से आपको फ़ाइल सिस्टम तक पहुंचने में सक्षम होना चाहिए और अपनी फ़ाइल को पुनर्प्राप्त करना चाहिए।


नहीं। उस निर्देशिका में केवल शामिल है layersizeऔर json, और उपयोगकर्ता पढ़ने योग्य भी नहीं है (भले ही उपयोगकर्ता docker समूह में हो)। /var/lib/docker/aufs/diffउस फ़ाइल को सम्‍मिलित करेंगे, जिसे मैं खोज रहा हूं (लेकिन कंटेनर आईडी द्वारा वर्गीकृत नहीं है) और पठनीय भी नहीं है।
ब्लाकबैट

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

पठनीय नहीं होने से, यह कैसे दिखाता है? मुझे एक उदाहरण मिला है जहाँ आप कंटेनरों से / var / lib / docker / aufs / diff / * directory में जाकर टेक्स्ट फाइल खींच सकते हैं
ryekayo

मेरी गलती। उपयोगकर्ता /var/lib/docker/aufs(लेकिन सभी अन्य निर्देशिकाओं में नहीं /var/lib/docker/) का उपयोग कर सकता है
BlakBat

क्या आप जड़ के रूप में पहुँच सकते हैं?
रेकायो

0

यदि पूर्ण आउटपुट का 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 को दोहराने की आवश्यकता हो सकती है जब तक कि आपको सही एक न मिल जाए

अपने मामलों के लिए सही छवि के नाम, चेकसम और फ़ाइल नाम के साथ ऊपर के आदेशों में राजधानियों में पाठ को बदलें।

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