ডকার - আমি কোনও চিত্র থেকে কোনও হোস্টে কীভাবে অনুলিপি করতে পারি?


117

আমার প্রশ্নটি কনটেইনার থেকে হোস্টগুলিতে ফাইলগুলি অনুলিপি করার বিষয়ে এই প্রশ্নের সাথে সম্পর্কিত ; আমার একটি ডকফাইফিল রয়েছে যা নির্ভরতা আনে, উত্স থেকে একটি বিল্ড আর্টিক্ট সংকলন করে এবং একটি এক্সিকিউটেবল চালায়। আমি বিল্ড আর্টিক্টটিও অনুলিপি করতে চাই (আমার ক্ষেত্রে এটি '.. / টার্গেট / in .zipদ্বারা উত্পাদিত sbt dist, তবে আমি মনে করি এই প্রশ্নটি জার, বাইনারি ইত্যাদির ক্ষেত্রেও প্রযোজ্য think

docker cpপাত্রে কাজ করে, চিত্র নয়; কেবল একটি ফাইল বের করার জন্য আমার কি ধারক শুরু করা দরকার? একটি স্ক্রিপ্টে, আমি /bin/bashব্যাকগ্রাউন্ডে ইন্টারেক্টিভ মোডে দৌড়ানোর চেষ্টা করেছি , ফাইলটি অনুলিপি করছি এবং তারপরে ধারকটি মেরেছি, তবে এটি ক্লদ্গেই বলে মনে হচ্ছে। একটি ভাল উপায় আছে কি?

অন্যদিকে, আমি কেবল একটি .tarফাইল বের করার জন্য দৌড়ানোর পরে কোনও ফাইল আনপ্যাক করা এড়াতে চাই docker save $IMAGENAME(তবে এটি এখন সবচেয়ে সহজ, ধীরতম বিকল্প হিসাবে মনে হয়)।

আমি ডকার ভলিউম ব্যবহার করব, যেমন:

docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out

তবে আমি boot2dockerওএসএক্সে চলছি এবং আমি কীভাবে সরাসরি আমার ম্যাক হোস্ট ফাইল সিস্টেমে লিখতে জানি না (পঠন-লেখার খণ্ডগুলি আমার বুট 2 ডকার ভিএম-এর অভ্যন্তরে মাউন্ট করছে, যার অর্থ আমি সহজেই এর সাথে blah.zipকোনও চিত্র থেকে বের করার জন্য কোনও স্ক্রিপ্ট ভাগ করতে পারি না) অন্যদের।

উত্তর:


172

কোনও চিত্র থেকে একটি ফাইল অনুলিপি করতে, একটি অস্থায়ী ধারক তৈরি করুন, এটি থেকে ফাইলটি অনুলিপি করুন এবং তারপরে এটি মুছুন:

id=$(docker create image-name)
docker cp $id:path - > local-tar-file
docker rm -v $id

createকমান্ডটি ডকারের কোন সংস্করণটি যুক্ত করা / অপসারণ করা হয়েছিল (এটি 1.01 তে উপস্থিত নয়)
থারস্ম্মোনার

2
@ থারসুমনারকে docker createডকার ১.৩, ব্লগ.ডোকার.কম
ইগোর বুকানভ

1
কেন জানি সঠিক উত্তর হিসাবে এটি নির্বাচন করা হয়নি।
সেন্টাউ

1
অবশ্যই সঠিক উত্তর !!! ধারকের ভিতরে কোনও কিছুর উপর নির্ভর করে না ... গোলং স্ক্র্যাচ চিত্রগুলির জন্য, এটিই সম্ভব একমাত্র উপায়!
মার্সেলো ডি বিক্রয়

2
stdout এ অনুলিপি করার কোনও কারণ এবং তারপরে এটি কোনও স্থানীয় ফাইলে ডাইরেক্ট করবেন? যখন আমি এটি করেছি, এটি ফাইলের সামগ্রীর আগে এবং পরে বেশ কয়েকটি নিয়ন্ত্রণের অক্ষর ফেলেছিল। সরাসরি docker cp $id:path > local-tar-fileকাজ হিসাবে নিখুঁতভাবে কাজ।
যোনাতন

62

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

তবে, যদি আপনার ছবিতে কোনও catকমান্ড থাকে (এবং এটি অনেক ক্ষেত্রে এটি করবে), আপনি এটি একটি একক আদেশ দিয়ে করতে পারেন:

docker run --rm --entrypoint cat yourimage  /path/to/file > path/to/destination

যদি আপনার ছবিটি না থাকে তবে catকেবল একটি ধারক তৈরি করুন docker cpএবং আইগরের উত্তরের পরামর্শ অনুসারে কমান্ডটি ব্যবহার করুন ।


1
চমত্কার সমাধান। আমার কনটেইনারটি অ্যাক্সেস করতে পারেনি যেহেতু এটি চালু হওয়ার পরে এক সেকেন্ড ক্র্যাশ হয়েছিল তবে এর মধ্যে একটি ফাইল দখল করা দরকার needed এটি পুরোপুরি কাজ করে।
মিরোদিনহো

23

একটি খুব দ্রুত বিকল্পটি চলমান ধারক থেকে একটি মাউন্ট ভলিউমে ফাইলটি অনুলিপি করা:

docker run -v $PWD:/opt/mount --rm --entrypoint cp image:version /data/libraries.tgz /opt/mount/libraries.tgz

বাস্তব 0m0.446s

** ভিএস **

docker run --rm --entrypoint cat image:version /data/libraries.tgz > libraries.tgz

বাস্তব 0m9.014s


অন্তর্নিহিত ফাইল সিস্টেমটির সাথে সম্ভবত প্রথম উদাহরণে ফাইলটির অলস / অগভীর অনুলিপি (অনুলিপি-অন-লেখার কথা মনে করে) সম্পাদনের সাথে আরও কিছু করতে হবে, বনাম আসলে দ্বিতীয় উদাহরণে ফাইলের বাইটগুলি অনুলিপি করতে হবে। একটি দরকারী পরীক্ষা কিনা তা দেখতে হবে cat a >bবনাম cp a bঅনুরূপ সময় আছে দেখানো হচ্ছে না। এছাড়াও, যদি উত্স পথ এবং গন্তব্য পথ পৃথক পৃথক ফাইল সিস্টেমে থাকে তবে উভয় উদাহরণই বাইট-ফর-বাইট কপির দিকে নিয়ে যাবে।
কেভিনআর

14

পিতামাতার মন্তব্য ইতিমধ্যে বিড়াল কীভাবে ব্যবহার করবেন তা দেখিয়েছে । আপনি অনুরূপ ফ্যাশনেও টার ব্যবহার করতে পারেন :

docker run yourimage tar -c -C /my/directory subfolder | tar x

1
এই উত্তরটি মূল প্রশ্নটি সম্পর্কে জিজ্ঞাসা করার সাথে সাথে ফাইলগুলি পরিবর্তে ফাইলগুলি অনুলিপি করা হয়। তবে, +1 কারণ এটি ফাইলগুলির সাথেও কাজ করে এবং একটি অতিরিক্ত বৈশিষ্ট্য নিয়ে আসে: অনুমতি এবং মালিক সংরক্ষণ। গ্রেট!
ক্যালিগারি

5
প্রকৃতপক্ষে, আমি ব্যবহার করিdocker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
11:54 এ ক্যালিগারি

6
docker cp $(docker create registry.example.com/ansible-base:latest):/home/ansible/.ssh/id_rsa ./hacked_ssh_key

একটি এক লাইন সমাধান সরবরাহ করতে চেয়েছিলেন

সম্পাদনা: ধারক এমনকি এই সমাধান চালানো হয় না


1

এই সমস্যার আরেকটি (সংক্ষিপ্ত) উত্তর:

docker run -v $PWD:/opt/mount --rm -ti image:version bash -c "cp /source/file /opt/mount/"

0

আমি ম্যাকওএসে বুট 2 ডকার ব্যবহার করছি। আমি আপনাকে আশ্বস্ত করতে পারি যে "ডকার সিপি" ভিত্তিক স্ক্রিপ্টগুলি পোর্টেবল are কারণ কোনও কমান্ড বুট 2 ডকারের মধ্যে রিলে করা হয় তবে বাইনারি স্ট্রিমটি আপনার ম্যাকটিতে চলমান ডকার কমান্ড লাইন ক্লায়েন্টের কাছে ফিরে আসে। সুতরাং ডকার ক্লায়েন্টের লিখিত ক্রিয়াকলাপগুলি সার্ভারের মধ্যেই কার্যকর করা হয় এবং এক্সিকিউটিং ক্লায়েন্টের উদাহরণে আবার লেখা হয়!

আমি যে কোনও ডকার ধারক সরবরাহ করি তার সাথে ডকার ভলিউমের জন্য একটি ব্যাকআপ স্ক্রিপ্ট ভাগ করছি এবং আমার ব্যাকআপ স্ক্রিপ্টগুলি লিনাক্স এবং ম্যাকএস উভয় বুট 2 ডকারের সাথে পরীক্ষা করা হয়। ব্যাকআপগুলি সহজেই প্ল্যাটফর্মগুলির মধ্যে বিনিময় করা যায়। মূলত আমি আমার স্ক্রিপ্টের মধ্যে নিম্নলিখিত কমান্ডটি সম্পাদন করছি:

docker run --name=bckp_for_volume --rm --volumes-from jenkins_jenkins_1 -v /Users/github/jenkins/backups:/backup busybox tar cf /backup/JenkinsBackup-2015-07-09-14-26-15.tar /jenkins

একটি নতুন ব্যস্তবক্স কনটেইনার চালিত করে এবং আমার জেনকিন্স ধারকটির নাম জেনকিনস_জেঙ্কিনস_1 সহ মাউন্ট করে। পুরো ভলিউমটি ফাইল ব্যাকআপগুলিতে / জেনকিনসব্যাকআপ-2015-07-09-14-26-15.tar লেখা আছে

আমি ইতিমধ্যে লিনাক্স ধারক এবং আমার ম্যাক ধারক মধ্যে ব্যাকআপ বা পুনরুদ্ধার স্ক্রিপ্ট কোন সামঞ্জস্য না করে সংরক্ষণাগার সরিয়ে নিয়েছি। আপনি যদি এটি চান তবে পুরো স্ক্রিপ্টটি এখানে একটি টিউটোরিয়ালটি পাবেন: ব্ল্যাকলেবলপস / জেনকিন্স


0

আপনি হোস্টের কোনও স্থানীয় পাথটিকে পাত্রে কোনও পাথ এবং তারপরে আপনার স্ক্রিপ্টের শেষে সেই পাথে কাঙ্ক্ষিত ফাইল (গুলি) বাঁধতে পারেন cp

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

তারপরে আর কপি করার দরকার নেই।

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