ডকার চিত্র থেকে ফাইলটি সরান?


24

আমি ইমেজটি চালনা না করে ডকার চিত্র থেকে একটি ফাইল বের করতে চাই।

docker saveবিকল্প currrently আমার জন্য একটি টেকসই বিকল্প এটা ঠিক আন-আলকাতরা একটি নির্দিষ্ট ফাইল করার জন্য একটি ফাইল খুব বিশাল সংরক্ষণ হচ্ছে যেমন নয়।


আপনি কোন ডিস্ট্রো ব্যবহার করছেন?
রাইকায়ো

@ আরিকায়ো: উবুন্টু 14, ডকার 1.12.4 (এপিআই 1.24)
ব্ল্যাকব্যাট

উত্তর:


21

আপনি নিম্নলিখিত কমান্ডগুলির সাহায্যে একটি চিত্র থেকে ফাইলগুলি বের করতে পারেন:

docker create $image  # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id

docker create ডকুমেন্টেশন অনুসারে, এটি ধারকটি চালায় না:

docker createকমান্ড নিদিষ্ট চিত্রের উপর একটি লেখার যোগ্য ধারক স্তর তৈরি করে এবং নির্দিষ্ট কমান্ড চালানোর জন্য দেয়ঃ। কনটেইনার আইডি এর পরে মুদ্রিত হয় STDOUTdocker 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
@ ব্লাকব্যাট কি এই আপডেট হওয়া উত্তরটি আপনার পক্ষে কাজ করে? আমার ধারণা আমার একটি নতুন উত্তর তৈরি করা উচিত ছিল তবে এটি এখন হয়ে গেছে।
বিবিসি

1
@ বিবিসি এই আপডেট হওয়া উত্তরটি আসলে কোনও ধারক (প্রশ্নের কর্স) শুরু করে না, এবং এটির মূল হতে হবে না।
ব্লাকব্যাট

2

উপরের কেউই আমার পক্ষে কাজ করেনি। সম্পূর্ণ কার্যনির্বাহী আদেশটি হ'ল:

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

উদ্ধৃতি catব্যতীত ফাইল নাম ছাড়াই পাস করা হয়, তাই কী প্রদর্শিত হবে তা এটি জানে না। কমান্ড শেষ হওয়ার পরে ধারকটি মুছে ফেলা ভাল ধারণা।


আপনি যে কমান্ডটির কথা উল্লেখ করছেন সেটি কেবল ডকারের উপর নির্ভর করে এবং ডকফাইফিলে ENTRYPOINT / CMD কীভাবে সঠিকভাবে সেট করা হয়েছিল তার উপর নির্ভর করে কাজ করবে; উদ্ধৃত করার সাথে এর কোন যোগসূত্র নেই। আপনি ধারক মুছতে বলছেন, তবুও আপনি --rm নির্দিষ্ট করেছেন। শেষ অবধি, আমি যখন আমার প্রশ্ন পোস্ট করেছিলাম তখন আমি "চিত্রটি চালিত না করে" নির্দিষ্ট করেছিলাম এবং কোনও উত্তরই এটিকে বিবেচনায় নেওয়ার সমাধান নয়।
ব্লাকব্যাট

1
ডকফাইফিল আইতে কোনটি সিএমডি এবং ENTRYPOINT সেট করা হয়েছে তা নির্বিশেষে এটি সর্বদা কার্যকর হবে (অবশ্যই লিনাক্সে)। "ডকারের উপর নির্ভর করে" বলতে কী বোঝ? সেটিংস, সংস্করণ, এনভিভি, কী? আপনার প্রশ্নটি সঠিক নয় কারণ চিত্রগুলি কার্যকর করা যায় না, কেবল পাত্রে পারে। আমি মনে করি সঠিক উত্তর নেই, আপনাকে অনেকগুলি ফাইল ডিল করতে হবে বা একটি অস্থায়ী ধারক তৈরি করতে হবে। --rm অস্থায়ী ধারক সরিয়ে দেয়, অন্যের উত্তরগুলি আপনার ডিস্কে কিছুটা আবর্জনা ফেলে দেয়।
sekrett

1

যদি আমার ভুল না হয় তবে আমি বিশ্বাস করি যে ডকার পাত্রে উবুন্টুর জন্য নিম্নলিখিত ডিরেক্টরিতে তৈরি করা ক্যাশেড ফাইলগুলি সংরক্ষণ করা হয়:

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

সেখান থেকে আপনার ফাইল সিস্টেমটি অ্যাক্সেস করতে এবং আপনার ফাইলগুলি পুনরুদ্ধার করতে সক্ষম হওয়া উচিত।


নাঃ। সেই ডিরেক্টরিতে কেবল layersizeএবং রয়েছে এবং jsonএটি ব্যবহারকারী পঠনযোগ্য নয় (এমনকি ব্যবহারকারী ডকার গ্রুপে থাকলেও)। /var/lib/docker/aufs/diffআমি যে ফাইলটি খুঁজছি তা এতে থাকবে (তবে ধারক আইডির দ্বারা শ্রেণিবদ্ধ করা হয়) এবং এটি পাঠযোগ্যও নয়।
ব্ল্যাকব্যাট

আমাকে কয়েক দিন এবং আমি এটি সন্ধান করব। আমি জানি যে পাত্রে প্রবেশ না করে বা চালিত না করেই ফাইলগুলি পুনরুদ্ধার করার একটি উপায় আছে।
রাইকায়ো

পঠনযোগ্য নয়, এটি কীভাবে দেখায়? আমি একটি উদাহরণ পেয়েছি যেখানে আপনি কনটেইনারগুলি থেকে / var / lib / ডকার / aufs / diff / * ডিরেক্টরিতে গিয়ে টেক্সট ফাইলগুলি টানতে পারবেন
রাইকায়েও

আমার ভুল. ব্যবহারকারী অ্যাক্সেস করতে পারবেন /var/lib/docker/aufs(তবে সমস্ত ডিরেক্টরি এতে নয় /var/lib/docker/)
ব্লকব্যাট

আপনি কি রুট হিসাবে অ্যাক্সেস করতে পারেন?
রাইকায়ো

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 তে সন্ধানের তারিখের সাথে একাধিক ফাইলের সন্ধান করে থাকেন তবে আপনি সঠিক ফাইলটি না পাওয়া পর্যন্ত তাদের প্রতিটির জন্য চার ধাপ পুনরাবৃত্তি করতে হবে may

আপনার ক্ষেত্রে সঠিক চিত্রের নাম, চেকসাম এবং ফাইলের নাম দিয়ে উপরের কমান্ডগুলিতে রাজধানীর পাঠ্যগুলিকে প্রতিস্থাপন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.