বিদ্যমান ডকার পাত্রে কীভাবে আমি একটি ভলিউম যুক্ত করতে পারি?


297

আমার কাছে একটি ডকার পাত্রে রয়েছে যা আমি উবুন্টুতে ডকার ইনস্টল করে এবং করার মাধ্যমে তৈরি করেছি:

sudo docker run -i -t ubuntu /bin/bash

আমি সঙ্গে সঙ্গে জাভা এবং কিছু অন্যান্য সরঞ্জাম ইনস্টল করতে শুরু করেছি, এটির সাথে কিছুটা সময় ব্যয় করেছি এবং কন্টেইনারটি বন্ধ করে দিয়েছি

exit

তারপরে আমি একটি ভলিউম যুক্ত করতে চেয়েছি এবং বুঝতে পেরেছিলাম যে এটি এতটা সোজা নয় যা আমি ভেবেছিলাম এটি হবে। আমি যদি এটি ব্যবহার করি sudo docker -v /somedir run ...তবে আমি একটি নতুন নতুন ধারক দিয়ে শেষ করব, তাই আমি জাভা ইনস্টল করব এবং একটি মাউন্টযুক্ত ভলিউম সহ একটি ধারকটিতে পৌঁছানোর আগে আমি ইতিমধ্যে যা করেছি তা করব।

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

বিদ্যমান পাত্রে কোনও ভলিউম যুক্ত করার পক্ষে এটি কি একমাত্র উপায়?


1
কনটেইনারগুলির পরে, এগুলি প্রোগ্রামারগুলির একটি অবিচ্ছেদ্য অঙ্গ হয়ে গেছে এবং তাই এই জাতীয় প্রশ্নগুলি এখানে প্রায়শই পোস্ট করা হয়। প্রশ্নাবলি এখানে পোস্ট ব্যবহার dockerট্যাগ হয় 34k + + , যা ঐ দুই সাইটগুলিতে চেয়ে বেশি উপায় stackoverflow.com/questions/tagged/docker
এম এ হোসেন Tonu

উত্তর:


394

আপনি আপনার বিদ্যমান ধারককে প্রতিশ্রুতিবদ্ধ করতে পারেন (এটি কনটেইনারগুলির পরিবর্তনগুলি থেকে একটি নতুন চিত্র তৈরি করে) এবং তারপরে এটি আপনার নতুন মাউন্টগুলি দিয়ে চালানো যেতে পারে।

উদাহরণ:

$ docker ps  -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                          PORTS               NAMES
    5a8f89adeead        ubuntu:14.04          "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       agitated_newton

$ docker commit 5a8f89adeead newimagename

$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash

সবকিছু ঠিকঠাক থাকলে, আপনার পুরানো ধারক বন্ধ করুন এবং এই নতুনটি ব্যবহার করুন।

এটাই :)


22
এবং যদি কোনও কারণে আপনাকে পুরানো নামটি নিতে নতুন ধারক প্রয়োজন হয় তবে পুরানো নামটি সরিয়ে দেওয়ার পরে ডকারের পুনরায় নাম ব্যবহার করুন ।
ডিস্ক

10
কেবলমাত্র এটি উল্লেখ করতে চেয়েছিলেন যেখানে উপরে আপনি উল্লেখ করেছেন newnameofcontainerযে এটি সম্ভবত নামকরণ করা উচিত new_image_name- কারণ আপনার সিস্টেমে docker commitএকটি নতুন চিত্র তৈরি করে । এরপরে নীচে আপনি যখন কোনও কাজ করবেন docker runআপনি সেই চিত্রটির নামটি ব্যবহার করুন যা থেকে আপনি একটি নতুন ধারক চালাতে চান। উপরের কাজগুলি কিন্তু অন্যদের জন্য কেবল স্পষ্ট করে বলতে চেয়েছিল যে উপরের স্থানধারক নতুন নামকারীর নাম প্রকৃতপক্ষে একটি নতুন চিত্রের নাম। ধন্যবাদ! দুর্দান্ত উত্তর ওহ, আপনি প্রথম ডকার কমিট কমান্ডটি ব্যবহার করে সদ্য নির্মিত চিত্রটি দেখতে পাচ্ছেনdocker image ls
ফায়ারড্রাগন

3
আসলে, আপনি যদি কোনও চিত্র থেকে শুরু করতে চান তবে আপনাকে নতুন ধারক করার দরকার নেই। শুধু docker run -v /srv/a:/tmp ubuntu:14.04ভাল।
ইয়ংহাও হু

আমার কাছে ইতিমধ্যে সমস্ত ফাইল সহ একটি ধারক চলছে। যদি উপরের পদ্ধতিটি নতুন ধারক তৈরি করে, তবে আমি আবার আর সব কিছু তৈরি করতে পারি না। নতুন ধারক বা চিত্র তৈরি না করে আমি কী এড়াতে এবং মাউন্ট করতে পারি এমন কোনও উপায় আছে?
ধীনার

এটি কি পুরানো ধারক থেকে পুরানো ভলিউম ম্যাপিংগুলিকে রাখবে বা নতুন কনটেইনারটি দিয়ে কি আমি সেগুলি পুনরায় ঘোষণা করব?
বিয়বিয়ানকাউন্টার

79

চলমান ধারকটিতে ভলিউম যুক্ত করার কোনও উপায় আমাদের কাছে নেই তবে এই লক্ষ্য অর্জনের জন্য আপনি নীচের আদেশগুলি ব্যবহার করতে পারেন:

একটি ধারক এবং স্থানীয় ফাইল সিস্টেমের মধ্যে ফাইল / ফোল্ডারগুলি অনুলিপি করুন: -

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

রেফারেন্সের জন্য দেখুন:

https://docs.docker.com/engine/reference/commandline/cp/


47
সেখানে প্রয়োজন এবং একটি ধারক থেকে একটি ভলিউম মাউন্ট এবং ফাইল কপি মধ্যে একটি বিশাল পার্থক্য আছে ...
জুলে

31
যাইহোক এটি আমাকে সাহায্য করেছিল। আমি 'ডকার সিপি' কমান্ডটি জানতাম না, এবং ঠিক এটি অর্জন করার চেষ্টা করছিলাম - চালক ধারক থেকে হোস্টে ফাইলগুলি অনুলিপি করুন।
ইভান

3
এটি কোনও মাউন্ট নয়, তবে ধারক এবং স্থানীয় হোস্টের মধ্যে ফাইলগুলি ফিরিয়ে আনতে সুবিধাজনক।
লাইনহর

যদিও এটি স্থানীয়ভাবে ধারক সামগ্রীগুলির প্রতিলিপি করার সমস্যার সমাধান করে, এটি কোনও ভলিউম মাউন্ট করার সমতুল্য হওয়ার কাছাকাছি নয় এবং এটি বিকল্প হিসাবে ভাবা উচিত নয়। যথা, প্রতিলিপিটি ব্যবহারকারী দ্বারা পরিচালনা করতে হবে এবং ডেটা এখন দুটি স্থানে রয়েছে।
সেবাস্তিয়ান গাওদা

1
আমি বুঝতে পারছি না কেন এত বেশি ভোট, জিজ্ঞাসা করা প্রশ্নের এটি একটি খুব ভুল উত্তর।
জোও মাতোস

33

আমি /home/<user-name>আমার হোস্টের /mntফোল্ডারটি বিদ্যমান (চলমান নয়) ধারকটির ফোল্ডারে সফলভাবে মাউন্ট করেছি । আপনি নিম্নলিখিত পদ্ধতিতে এটি করতে পারেন:

  1. থামানো ধারকটির সাথে সম্পর্কিত কনফিগারেশন ফাইলটি খুলুন, যা এখানে পাওয়া যাবে /var/lib/docker/containers/99d...1fb/config.v2.json( config.jsonডকারের পুরানো সংস্করণগুলির জন্য হতে পারে )।

  2. এই MountPointsঅধ্যায়, যা আমার ক্ষেত্রে খালি ছিল: "MountPoints":{}। এরপরে বিষয়বস্তুগুলিকে এরকম কিছু দিয়ে প্রতিস্থাপন করুন (আপনি সঠিক সেটিংস সহ অন্য ধারক থেকে যথাযথ সামগ্রীগুলি অনুলিপি করতে পারেন):

"MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

বা একই (ফর্ম্যাট):

  "MountPoints": {
    "/mnt": {
      "Source": "/home/<user-name>",
      "Destination": "/mnt",
      "RW": true,
      "Name": "",
      "Driver": "",
      "Type": "bind",
      "Propagation": "rprivate",
      "Spec": {
        "Type": "bind",
        "Source": "/home/<user-name>",
        "Target": "/mnt"
      },
      "SkipMountpointCreation": false
    }
  }
  1. ডকার পরিষেবাটি পুনরায় চালু করুন: service docker restart

এটি আমার জন্য উবুন্টু 18.04.1 এবং ডকার 18.09.0 এর সাথে কাজ করে


3
উত্তরের জন্য ধন্যবাদ. ধাপ 3 গুরুত্বপূর্ণ। আমি আরও যোগ করব যে লেখার আগে ডকার পাত্রে প্রথমে থামানো ভাল।
বুজপি ২

7
এটি সর্বোত্তম উত্তর কারণ এটি বিদ্যমান পাত্রে সম্পূর্ণ সংরক্ষণ করে। এটি আমি করলাম: 1. ডকার ইঞ্জিনটি বন্ধ systemctl stop docker.serviceকরুন : ২. সম্পাদনা config.v2.json: vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)৩. একটি ফাইলে আপডেট সংরক্ষণ করুন: :w config.v2.json৪. Vim থেকে প্রস্থান :q!করুন: jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.jsonexisting. বিদ্যমান ফাইলটি আপডেট করুন: 6.. ডকার ইঞ্জিন systemctl start docker.serviceশুরু করুন : necessary. প্রয়োজনে ধারকটি শুরু করুন : docker start <container-name/ID>8. উপভোগ করুন :-)
অ্যান্ড্রয়েড কন্ট্রোল

2
মূল ধাপ হল service docker restart। আমি চেষ্টা করেছিলাম docker restart <container>তখন নতুন কনফিগারটি বাছাই করা হয়নি, এবং এটি পুরানো কনফিগারেশনে ওভাররাইট হয়ে যাচ্ছে।
কেএফএল

1
এছাড়াও jqচমত্কার সাহায্য করবে তাই এটা mroe মানুষের সম্পাদনাযোগ্য তাদেরকে JSON মুদ্রণ:cat config.v2.json | jq . > config.json
KFL

14

জেরুম পেটাজোনির একটি কন্টেইনারটি চলার সময় কীভাবে একটি ভলিউম সংযুক্ত করা যায় তার সম্পর্কে একটি আকর্ষণীয় ব্লগ পোস্ট রয়েছে । এটি বক্সের বাইরে ডকারের মধ্যে তৈরি এমন কিছু নয়, তবে এটি সম্পাদন করা সম্ভব।

যেমন তিনি উল্লেখ করেছেন

এটি ব্লক ডিভাইসের ভিত্তিতে নয় এমন ফাইল সিস্টেমগুলিতে কাজ করবে না।

এটি কেবল তখনই কাজ করবে যখন / proc / মাউন্টগুলি সঠিকভাবে ব্লক ডিভাইস নোডের তালিকাবদ্ধ করে (যা আমরা উপরে দেখলাম, অগত্যা সত্য নয়)।

এছাড়াও, আমি কেবল এটি আমার স্থানীয় পরিবেশে পরীক্ষা করেছি; এমনকি আমি কোনও ক্লাউড উদাহরণ বা এ জাতীয় কিছুতে চেষ্টাও করিনি

YMMV


8

দুর্ভাগ্যক্রমে একটি ভলিউম মাউন্ট করার স্যুইচ বিকল্পটি কেবলমাত্র runকমান্ডটিতে পাওয়া যায় ।

docker run --help

-v, --volume list Bind mount a volume (default [])

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

  1. আপনার ধারকটি রফতানি করুন docker container export -o ./myimage.docker mycontainer
  2. একটি চিত্র হিসাবে আমদানি করুন docker import ./myimage.docker myimage
  3. তারপর docker run -i -t -v /somedir --name mycontainer myimage /bin/bash

1
এফওয়াইআই - docker container1.11.2-তে কোনও বৈধ কমান্ড নয় (এটি সর্বশেষ সংস্করণ যা এই লেখার মতো সিনোলজি দ্বারা সমর্থিত)। যদিও এটি যুক্ত করা হয়েছিল তখন কোনও দস্তাবেজ বলতে পাচ্ছি না। এক্ষেত্রে প্রথম কমান্ডটি হ'ল docker export -o ./myimage.docker mycontainer
ক্রিস আর। ডোনেলি

2

দীর্ঘকাল ধরে এই সমস্যাটি সন্ধান করার পরে ডকার উইন্ডোজ পাত্রে ব্যবহার করার জন্য একটি নোট!

Condiditions:

  • উইন্ডোজ 10
  • ডকার ডেস্কটপ (সর্বশেষ সংস্করণ)
  • মাইক্রোসফ্ট / এমএসকিউএল-সার্ভার-উইন্ডোজ-বিকাশকারীদের জন্য ডকার উইন্ডোজ কনটেইনার ব্যবহার করুন

সমস্যা:

  • আমি আমার উইন্ডোজ ধারকটিতে একটি হোস্ট ডিকশনারি মাউন্ট করতে চেয়েছিলাম।

আংশিকভাবে এখানে ডিস্রিপ্ট করা সমাধান:

  • ডকার পাত্রে তৈরি করুন

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

  • ধারক কমান্ড শেল যান

docker exec -it <CONTAINERID> cmd.exe

  • ডিআইআর তৈরি করুন

mkdir DirForMount

  • ধারক বন্ধ করুন

docker container stop <CONTAINERID>

  • ধার্য করা পাত্র

docker commit <CONTAINERID> <NEWIMAGENAME>

  • পুরানো ধারক মুছুন

docker container rm <CONTAINERID>

  • নতুন চিত্র এবং ভলিউম মাউন্টিং সহ নতুন ধারক তৈরি করুন

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>

এর পরে আমি ডকার উইন্ডোজ পাত্রে এই সমস্যাটি সমাধান করেছি।


-3

সর্বোত্তম উপায় হ'ল আপনার স্থানীয় ফাইল সিস্টেমের ডিরেক্টরিতে সমস্ত ফাইল এবং ফোল্ডার অনুলিপি করা: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATHকন্টেইনারে DEST_PATHলোকালহোস্টে আছে

তারপরে docker-compose downএকই সাথে একটি ভলিউম সংযুক্ত করুন DEST_PATHএবং ব্যবহার করে ডকার পাত্রে চালানdocker-compose up -d

প্রবেশ করে ভলিউম যুক্ত করুন docker-compose.yml

volumes:
 - DEST_PATH:SRC_PATH

উপরে আরও ভাল বিকল্প রয়েছে options
মিঃআর

প্রকৃতপক্ষে, উপরে আরও ভাল বিকল্প রয়েছে এবং চারপাশের ফাইলগুলি অনুলিপি করা তাদের মাউন্ট করছে না। এছাড়াও, ডকার-রচনা বিকল্পের জন্য প্রদত্ত "ভলিউম" সংজ্ঞাটি অন্যভাবে: ভলিউম: - HOST_PATH: CONTAINER_PATH
গিলিয়াম এস এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.