ডকার এডিএড বনাম ভলিউম


116

আমি ডকার শিখছি এবং কখন এবং কোথায় ব্যবহার করব ADDএবং তা নিয়ে আমার সন্দেহ আছে VOLUME। আমি মনে করি এই দু'জনেই কি করে:

এডিডি

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

ভলিউম

আমি বুঝতে পেরেছি যে docker run -vআপনি ব্যবহার করে আপনার ধারকটির ভিতরে একটি হোস্ট ফোল্ডার মাউন্ট করতে পারেন, আপনি সহজেই ফাইলগুলি পরিবর্তন করতে পারেন এবং আপনার ধারকটিতে থাকা অ্যাপ্লিকেশনটি পরিবর্তনগুলির প্রতিক্রিয়া জানায়। এটি উন্নয়নে দুর্দান্ত দেখায়, তবে কীভাবে আমার ফাইলগুলি এইভাবে স্থাপন করা যায় তা সম্পর্কে আমি নিশ্চিত নই।


3
সাধারণভাবে, এটি পছন্দ COPYকরা ভাল ADD। এগুলি প্রায় একই রকম, তবে ADDকিছু অতিরিক্ত দক্ষতা আর্ট URL এবং সংরক্ষণাগার ফাইল রয়েছে যা অবাক করে দিতে পারে।
অ্যাড্রিয়ান মৌআত

2
@ জেমস্মস্টোন - এই লিঙ্কটি (এবং অফিসিয়াল ডকার ডকস) বিপরীতে সুপারিশ করেছে - অ্যাডির পরিবর্তে কপি ব্যবহার করুন।
সফটওয়্যার ইঞ্জিনিয়ার

উফ, আপনি ঠিক বলেছেন - চিয়ার্স!
জেমসস্টোন

উত্তর:


183

এডিডি

এই দুটিয়ের মধ্যে মৌলিক পার্থক্য হ'ল ADDআপনি যা যা যোগ করছেন তা তৈরি করে, এটি কোনও ফোল্ডার হতে পারে বা কেবল কোনও ফাইলই আপনার চিত্রের অংশ হিসাবে থাকে । আপনার নির্মিত ছবিটি পরে যে কেউ ব্যবহার করে তার যে কোনও কিছুতে অ্যাক্সেস থাকবে ADD। এটি পরেও সত্য হয় যদি আপনি পরে এটি অপসারণ করেন কারণ ডকার স্তরগুলিতে কাজ করে এবং ADDচিত্রটি ইমেজের অংশ হিসাবে এখনও বিদ্যমান থাকবে। স্পষ্টতই, আপনি কেবল ADDবিল্ড টাইম এ এমন কিছু ADDযা রান-টাইমে কখনও করতে পারবেন না ।

আপনি যে কয়েকটি ক্ষেত্রে ব্যবহার করতে চান তার কয়েকটি উদাহরণ ADD:

  • আপনার একটি ডক্সফাইলে রেফারেন্স এবং ইনস্টল করতে চান এমন একটি টেক্সট ফাইলের কিছু প্রয়োজনীয়তা রয়েছে। তারপরে আপনি এটি করতে পারেন: ADD ./requirements.txt /requirements.txtএরপরেRUN pip install -r /requirements.txt
  • আপনি আপনার ডকফাইলে প্রসঙ্গ হিসাবে আপনার অ্যাপ্লিকেশন কোডটি ব্যবহার করতে চান, উদাহরণস্বরূপ, আপনি যদি নিজের চিত্রটিতে আপনার অ্যাপ ডিরেক্টরিটি কার্যনির্বাহী ডিয়ার হিসাবে সেট করতে চান এবং আপনার চিত্র থেকে কোনও ধারকটিতে ডিফল্ট কমান্ড রাখতে চান তবে আপনার অ্যাপটি চালান, আপনি পারব:

    ADD ./ /usr/local/git/my_app

    WORKDIR /usr/local/git/my_app

    CMD python ./main.py

ভলিউম

অন্যদিকে ভলিউম, কেবল আপনার চিত্র থেকে চালিত একটি ধারককে যে কোনও স্থানীয় মেশিনটি চালিত হচ্ছে তার কোনও পথে অ্যাক্সেস করতে দেয়। আপনি আপনার ডকফাইলে আপনার VOLUMEডিরেক্টরি থেকে ফাইলগুলি ব্যবহার করতে পারবেন না । আপনার ভলিউম ডিরেক্টরিতে যে কোনও কিছুই বিল্ড-টাইমে অ্যাক্সেসযোগ্য হবে না তবে রান-টাইমে অ্যাক্সেসযোগ্য হবে

আপনি যে কয়েকটি ক্ষেত্রে ব্যবহার করতে চান তার কয়েকটি উদাহরণ VOLUME:

  • আপনার ধারকটিতে চলমান অ্যাপ্লিকেশনটি লগ ইন করে /var/log/my_app। আপনি চাইছেন যে লগগুলি হোস্ট মেশিনে অ্যাক্সেসযোগ্য হবে এবং ধারকটি সরিয়ে ফেলা হলে মুছে ফেলা হবে না। আপনি আপনার ডকফাইফিল /var/log/my_appযুক্ত করে মাউন্ট পয়েন্ট তৈরি করে এবং এর VOLUME /var/log/my_appসাথে আপনার ধারকটি চালিয়ে এটি করতে পারেনdocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
  • আপনার কাছে কিছু স্থানীয় সেটিংস ফাইল রয়েছে যা আপনি ধারকটিতে থাকা অ্যাপ্লিকেশনটিতে অ্যাক্সেস পেতে চান। সম্ভবত এই সেটিং ফাইলগুলি আপনার স্থানীয় মেশিন বনাম দেব বনাম উত্পাদনে আলাদা। বিশেষত তাই যদি সেই সেটিংস ফাইলগুলি গোপন থাকে তবে সেক্ষেত্রে আপনি অবশ্যই সেগুলি আপনার ইমেজে চান নাVOLUME /etc/settings/my_app_settingsসেক্ষেত্রে একটি ভাল কৌশল হ'ল আপনার ডকফাইফিলকে যুক্ত করা, আপনার ধারকটি দিয়ে চালানো docker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tagএবং আপনার অ্যাপটি চালিত হওয়ার প্রত্যাশা যে সমস্ত পরিবেশে / হোস্ট / সেটিংস / ডিয়ার রয়েছে তা নিশ্চিত করে তোলা।

13
এখন পর্যন্ত সবচেয়ে দরকারী পোস্টটি আমি এডিডি এবং
ভলিউমে

5
VOLUME নির্দিষ্ট করা থাকলেও ডকার রান চলাকালীন সরবরাহ না করা হলে কী ঘটে (যেমন -v xxx প্যারামিটারটি অনুপস্থিত)? শ্রম হয়। ভলিউম তাহলে কার্যকরভাবে ক্ষণস্থায়ী হয়ে উঠছে?
col.panic

একটি ডকফাইফিলের অভ্যন্তরে, ভলিউম সম্ভবত কেবল অধ্যবসায় এবং / অথবা ডিবাগিংয়ের জন্য বোঝানো হয়, তবে আপনি কোনও বিদ্যমান চিত্রটিতে কোনও অ্যাপ্লিকেশন পেতে (ডকফরফিলের প্রয়োজন নেই) ভলিউম কমান্ড লাইন সুইচটি ব্যবহার করতে পারেন এবং এটি এ জাতীয়ভাবে চালাতে পারেন docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
চিনোটো ভোকরো

চমৎকার "স্তর" বিশদ
স্ট্রোটোভারিয়াস

27

VOLUMEনির্দেশ রানটাইম আপনার Docker কন্টেইনারে একটি ডাটা ভলিউম তৈরি করে। আর্গুমেন্ট হিসাবে প্রদত্ত ডিরেক্টরিটি VOLUMEহ'ল একটি ডিরেক্টরি যা ইউনিয়ন ফাইল সিস্টেমকে বাইপাস করে এবং মূলত অবিরাম এবং ভাগ করা ডেটার জন্য ব্যবহৃত হয়।

আপনি যদি চালনা করেন তবে আপনি বিভাগটির docker inspect <your-container>নীচে দেখতে পাবেন যে Mountsএকটি Sourceহোস্টে ডিরেক্টরি অবস্থানের প্রতিনিধিত্ব করে এবং একটি Destinationযা ধারকটিতে মাউন্ট করা ডিরেক্টরি অবস্থানের প্রতিনিধিত্ব করে। উদাহরণ স্বরূপ,

"Mounts": [
  {
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

এখানে 3 টি ব্যবহারের কেস রয়েছে docker run -v:

  1. docker run -v /data: এটি VOLUMEআপনার ডকফাইফিলের নির্দেশাবলী নির্দিষ্ট করার জন্য সাদৃশ্য।
  2. docker run -v $host_path:$container_path: এটি আপনাকে রানটাইম চলাকালীন আপনার ধারক $host_pathথেকে আপনার হোস্ট থেকে মাউন্ট করতে দেয় $container_path। বিকাশে, ধারকটির সাথে আপনার হোস্টে উত্স কোড ভাগ করার জন্য এটি দরকারী। উত্পাদনে, এটি হোস্টের ডিএনএস তথ্য (পাওয়া যায় /etc/resolv.conf) বা পাত্রে গোপনীয়গুলির মতো জিনিসগুলি মাউন্ট করতে ব্যবহৃত হতে পারে । বিপরীতে, আপনি হোস্টের নির্দিষ্ট ফোল্ডারে ধারকটির লগগুলি লেখার জন্যও এই কৌশলটি ব্যবহার করতে পারেন। উভয় $host_pathএবং $container_pathঅবশ্যই পরম পাথ হতে হবে।
  3. docker run -v my_volume:$container_path: এটি আপনার ধারকটিতে একটি ডেটা ভলিউম তৈরি করে $container_pathএবং এটির নাম দেয় my_volume। এটি মূলত ব্যবহার করে একটি ভলিউম তৈরি করা এবং নামকরণ করার মতো docker volume create my_volumeফ্লোরকারের মতো মাল্টি-হোস্ট স্টোরেজ ড্রাইভার ব্যবহার করে একটি ধারক ডেটা ভলিউম এবং একটি ভাগ-স্টোরেজ ভলিউমের জন্য এই জাতীয় ভলিউমের নামকরণ কার্যকর

লক্ষ্য করুন যে কোনও হোস্ট ফোল্ডারটিকে ডেটা ভলিউম হিসাবে মাউন্ট করার পন্থা ডকফাইফিলে উপলব্ধ নয়। ডকার ডকুমেন্টেশন উদ্ধৃত করতে ,

দ্রষ্টব্য: এটি পোর্টেবিলিটি এবং ভাগ করে নেওয়ার উদ্দেশ্যে এই ডকফায়াইল থেকে পাওয়া যায় না। হোস্ট ডিরেক্টরিটি হ'ল প্রকৃতি অনুসারে, হোস্ট-নির্ভর, একটি ডকফেরফায়লে বর্ণিত একটি হোস্ট ডিরেক্টরি সম্ভবত সমস্ত হোস্টে কাজ করবে না।

এখন আপনি যদি অ- বিকাশীয় পরিবেশে আপনার ফাইলগুলি কন্টেইনারে অনুলিপি করতে চান তবে আপনি নিজের ডকফাইফিলের নির্দেশাবলী ADDবা COPYনির্দেশাবলী ব্যবহার করতে পারেন । এগুলি আমি সাধারণত অ-উন্নয়নমূলক স্থাপনার জন্য ব্যবহার করি।


3
আমার 2 ডকার ফাইল তৈরি করা উচিত? একটি উন্নয়নের জন্য এবং একটি স্থাপনার জন্য?
ক্রিশ্চিয়ান গার্সিয়া

আমি তাই মনে করি না. ADDআপনার ডকফাইফিলে নির্দেশনা থাকাতে কোনও সমস্যা নেই কারণ এটি কেবল docker buildআদেশ দ্বারা কার্যকর করা হয়েছে । যখন অন্যরা প্রথমবার আপনার ধারক তৈরি করে এবং আপনি যখন এটি অন্য অ-উন্নয়ন পরিবেশে স্থাপন করতে প্রস্তুত হন তখন এটি প্রয়োজন।
আইভান.সিম

3
তবে ফাইলগুলি ছাড়া কোনও চিত্র তৈরি করা এবং -vউন্নয়নের জন্য কমান্ডটি ব্যবহার করা কি আরও দক্ষ হবে না এবং আরও একটি ডকার ফাইল এমন একটি চিত্র তৈরি করতে পারে যাতে ADDমোতায়েনের জন্য ফাইলগুলি অন্তর্ভুক্ত থাকে ?
ক্রিশ্চিয়ান গার্সিয়া

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

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