ডকারফাইলে "ভলিউম" নির্দেশনা বোঝা


136

নীচে আমার "ডকফেরফাইল" এর লিখিত সামগ্রী রয়েছে

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app

# change working dir to /usr/src/app
WORKDIR /usr/src/app

VOLUME . /usr/src/app

RUN npm install

EXPOSE 8080

CMD ["node" , "server" ]

এই ফাইলে আমি "VOLUME। / Usr / src / app" হোস্টে উপস্থিত ওয়ার্কিং ডিরেক্টরীটির সামগ্রীগুলি মাউন্ট করার জন্য / ইউএসআর / এসসিআর / অ্যাপ্লিকেশন ফোল্ডারে কনটেইনারটি স্থাপনের জন্য প্রত্যাশা করছি।

দয়া করে আমাকে জানান দয়া করে এটি সঠিক উপায় কিনা?

উত্তর:


88

অফিসিয়াল ডকার টিউটোরিয়াল বলেছেন:

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

  • একটি ধারক তৈরি করা হলে ভলিউমগুলি শুরু করা হয়। যদি ধারকটির বেস চিত্রটিতে নির্দিষ্ট মাউন্ট পয়েন্টে
    ডেটা থাকে , তবে বিদ্যমান ডেটাটি ভলিউম
    ইনিশিয়ালেশনের পরে নতুন ভলিউমে অনুলিপি করা হবে । (নোট করুন যে কোনও হোস্ট
    ডিরেক্টরি মাউন্ট করার সময় এটি প্রযোজ্য না ))
  • ডেটা ভলিউমগুলি ধারকগুলির মধ্যে ভাগ করা এবং পুনরায় ব্যবহার করা যেতে পারে।

  • একটি ডেটা ভলিউমের পরিবর্তনগুলি সরাসরি করা হয়।

  • আপনি যখন কোনও চিত্র আপডেট করেন তখন ডেটা ভলিউমের পরিবর্তনগুলি অন্তর্ভুক্ত হবে না।

  • কনটেইনারটি নিজেই মোছা থাকলেও ডেটা ভলিউম অব্যাহত থাকে।

এতে Dockerfileআপনি কেবল একটি ধারকের ভিতরে ভলিউমের গন্তব্য নির্দিষ্ট করতে পারেন । যেমন /usr/src/app

আপনি যখন কোনও ধারক চালাবেন, যেমন docker run --volume=/opt:/usr/src/app my_image, তবে আপনাকে হোস্ট মেশিনে এর মাউন্টিং পয়েন্ট ( / অপ্ট ) নির্দিষ্ট করতে হবে না । আপনি যদি যুক্তি নির্দিষ্ট না করেন তবে মাউন্ট পয়েন্টটি স্বয়ংক্রিয়ভাবে বেছে নেওয়া হবে, সাধারণত নীচে ।--volume/var/lib/docker/volumes/


275

সংক্ষেপে: না, আপনার VOLUMEনির্দেশনা সঠিক নয়।

VOLUMEকন্টেনার-সাইড পাথ প্রদত্ত ডকফাইফিলের এক বা একাধিক ভলিউম নির্দিষ্ট করে। তবে এটি চিত্র লেখককে কোনও হোস্ট পাথ নির্দিষ্ট করার অনুমতি দেয় না। হোস্ট-সাইডে, ভলিউমগুলি ডকার রুটের অভ্যন্তরে খুব দীর্ঘ আইডি-জাতীয় নাম দিয়ে তৈরি করা হয়। আমার মেশিনে এটি /var/lib/docker/volumes

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

আপনার উদাহরণ যা 'ব্যবহার করে'। চরিত্রটি এমনকি আমার মেশিনে চলবে না, আমি বিন্দুকে প্রথম বা দ্বিতীয় যুক্তি তৈরি করি না কেন। আমি এই ত্রুটি বার্তাটি পেয়েছি:

ডকার: ডেমোন থেকে ত্রুটি প্রতিক্রিয়া: oci রানটাইম ত্রুটি: ধারক_লিনক্স.গো: 265: ধারক প্রক্রিয়া শুরু হওয়ার কারণে "প্রক্রিয়া_লিনাক্স.গো: 368: ধারক আরআইআই \" ওপেন / দেব / পিটিএমএক্স: এরূপ কোনও ফাইল বা ডিরেক্টরি \ "" নয়। "

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

সংক্ষিপ্তসার: ভলিউম নির্দিষ্ট করে

এই ডকফায়াইল দেওয়া হয়েছে:

FROM openjdk:8u131-jdk-alpine
VOLUME vol1 vol2

(এই সংক্ষিপ্তসারটির ফলাফলের জন্য, আমরা নির্দিষ্ট করে দিলে vol1 vol2বা /vol1 /vol2- আমাকে কেন জিজ্ঞাসা করবে না তাতে কোন পার্থক্য নেই )

এটি তৈরি করুন:

docker build -t my-openjdk

চালান:

docker run --rm -it my-openjdk

ধারকটির ভিতরে, lsকমান্ড লাইনে চালনা করুন এবং আপনি দুটি ডিরেক্টরি উপস্থিত থাকতে দেখবেন; /vol1এবং /vol2

ধারকটি চালানো হোস্ট-সাইডে দুটি ডিরেক্টরি বা "ভলিউম" তৈরি করে।

ধারকটি চলমান থাকাকালীন, হোস্ট মেশিনে চালিত docker volume lsকরুন এবং আপনি এরকম কিছু দেখতে পাবেন (আমি নামের মাঝের অংশটি ব্রেভিটির জন্য তিনটি ডট দিয়ে প্রতিস্থাপন করেছি):

DRIVER    VOLUME NAME
local     c984...e4fc
local     f670...49f0

পাত্রে ফিরে , চালনা করুন touch /vol1/weird-ass-file( উল্লিখিত স্থানে একটি ফাঁকা ফাইল তৈরি করে)।

এই ফাইলটি এখন নামবিহীন ভলিউমের একটিতে হোস্ট মেশিনে উপলব্ধ is এটি আমার জন্য দুটি চেষ্টা করেছে কারণ আমি প্রথম তালিকাভুক্ত ভলিউমটি চেষ্টা করেছিলাম, তবে শেষ পর্যন্ত হোস্ট মেশিনে এই কমান্ডটি ব্যবহার করে আমার তালিকাটি দ্বিতীয় তালিকাভুক্ত ভলিউমে খুঁজে পেয়েছি:

sudo ls /var/lib/docker/volumes/f670...49f0/_data

একইভাবে, আপনি হোস্টে এই ফাইলটি মুছতে চেষ্টা করতে পারেন এবং এটি পাত্রেও মুছে ফেলা হবে।

দ্রষ্টব্য: _dataফোল্ডারটিকে "মাউন্ট পয়েন্ট" হিসাবেও উল্লেখ করা হয়।

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

একটি নতুন ধারক চালান, তবে ব্যবহার করে একটি ভলিউম নির্দিষ্ট করুন -v:

docker run --rm -it -v /vol3 my-openjdk

এই যোগ তৃতীয় ভলিউম এবং পুরো সিস্টেমের তিন নামহীন ভলিউম থাকার শেষ পর্যন্ত। আমরা কেবল নির্দিষ্ট করে দিলে কমান্ডটি ক্র্যাশ হত -v vol3। যুক্তিটি অবশ্যই ধারকটির ভিতরে একটি পরম পথ হতে হবে । হোস্ট-সাইডে, নতুন তৃতীয় ভলিউমটি বেনামে রয়েছে এবং অন্য দুটি খণ্ডের সাথে একত্রে থাকে ।/var/lib/docker/volumes/

এটি আগেই বলা হয়েছিল যে Dockerfileহোস্ট হোস্ট থেকে রানটাইম চলাকালীন কনটেইনার থেকে ফাইল আনার চেষ্টা করার সময় কোন সমস্যা আমাদের জন্য সমস্যা তৈরি করে এমন হোস্ট পাথটিতে মানচিত্র তৈরি করতে পারে না। একটি ভিন্ন -vবাক্য গঠন এই সমস্যাটির সমাধান করে।

ভাবুন আমার প্রজেক্ট ডিরেক্টরিতে আমার একটি সাবফোল্ডার রয়েছে ./srcযা আমি ধারকটির /srcভিতরে সিঙ্ক করতে চাই wish এই আদেশটি কৌশলটি করে:

docker run -it -v $(pwd)/src:/src my-openjdk

:চরিত্রের উভয় পক্ষই একটি নিখুঁত পথের প্রত্যাশা করে। বাম দিকটি হোস্ট মেশিনে একটি পরম পাথ, ডান দিকটি ধারকটির ভিতরে একটি পরম পথ। pwdএকটি কমান্ড যা "বর্তমান / কার্যনির্বাহী ডিরেক্টরি মুদ্রণ করে"। কমান্ড ফেলে $()প্রথম বন্ধনী মধ্যে কমান্ড লাগে, একটি subshell এটা চলে এবং উৎপাদনের আমাদের প্রকল্পের জন্য ডিরেক্টরির সঠিক পথটি ব্যাক।

এগুলি একসাথে রেখে, ধরে নিন যে ./src/Hello.javaআমাদের প্রকল্প ফোল্ডারে হোস্ট মেশিনে নিম্নলিখিত সামগ্রীগুলি রয়েছে:

public class Hello {
    public static void main(String... ignored) {
        System.out.println("Hello, World!");
    }
}

আমরা এই ডকফায়াইলটি তৈরি করি:

FROM openjdk:8u131-jdk-alpine
WORKDIR /src
ENTRYPOINT javac Hello.java && java Hello

আমরা এই আদেশটি চালাই:

docker run -v $(pwd)/src:/src my-openjdk

এই মুদ্রণ "হ্যালো, ওয়ার্ল্ড!"।

সর্বোত্তম অংশটি হ'ল আমরা জাভা ফাইলটি দ্বিতীয় বারের জন্য অন্য আউটপুটটির জন্য একটি নতুন বার্তা সহ - জাভা ফাইলটি সংশোধন করতে পুরোপুরি মুক্ত - চিত্রটি পুনর্নির্মাণ না করেই =)

চূড়ান্ত মন্তব্য

আমি ডকারে বেশ নতুন, এবং উপরে বর্ণিত "টিউটোরিয়াল" আমি 3 দিনের কমান্ড লাইন হ্যাকাথন থেকে সংগৃহীত তথ্য প্রতিফলিত করে। আমি প্রায় লজ্জা পেয়েছি আমি আমার বিবৃতি সমর্থন করে ইংরাজির মতো ডকুমেন্টেশনগুলির লিঙ্ক সরবরাহ করতে সক্ষম হইনি, তবে আমি সত্যই বলেছি এটি নথিভুক্তির অভাবে এবং ব্যক্তিগত প্রচেষ্টা নয় effort আমি জানি যে আমার বর্তমান সেটআপটি "উইন্ডোজ 10 -> ভ্যাগ্রান্ট 2.0.0 -> ডকার 17.09.0-ce" ব্যবহার করে বিজ্ঞাপন হিসাবে কাজ করা উদাহরণগুলি জানি।

টিউটোরিয়ালটি সমস্যার সমাধান করে না "আমরা কীভাবে ডকফাইফিলের মধ্যে ধারকটির পথটি নির্দিষ্ট করব এবং রান কমান্ডটি কেবল হোস্ট পাথ নির্দিষ্ট করে দিন"। কোনও উপায় থাকতে পারে, আমি এটি সন্ধান করি না।

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


2
কখন আমাদের নামবিহীন / বেনাম ভলিউম ব্যবহার করা উচিত?
সমুদ্রের

10
@ মার্টিন আপনাকে অনেক ধন্যবাদ আপনার হ্যাকাথন এবং এর ফলাফল টিউটোরিয়ালটি এখানে খুব বেশি ধরা পড়ে।
বিজার

6
"আমি ইংরাজির মতো ডকুমেন্টেশন সাফ করার জন্য লিঙ্ক সরবরাহ করতে পারিনি ... আমি সত্যই বলেছি এটি নথিপত্রের অভাবের কারণে হয়েছে"। আমি নিশ্চিত করতে পারি. এটি আমি খুঁজে পেয়েছি এবং সবচেয়ে ঘন্টা অনুসন্ধান করেছি most
ব্যবহারকারী 697576

4
docker volume pruneচলমান পাত্রে সংযুক্ত নয় এমন বাকী খণ্ডগুলি পরিষ্কার করতে ব্যবহার করা যেতে পারে। একাকী আইডি দিয়ে সম্ভাব্য গুরুত্বপূর্ণ ব্যক্তিদের পার্থক্য করা সহজ হবে তা বলার অপেক্ষা রাখে না ...
জেরেমি

4
"এই সংক্ষিপ্তসারটির ফলাফলের জন্য, যদি আমরা ভল্ট 1 ভোল 2 বা / ভোল 1 / ভোল 2 নির্দিষ্ট করে - তবে কেন আমাকে জিজ্ঞাসা করবেন না" তার কোনও পার্থক্য নেই। @ মার্টিনএন্ডারসন কারণ এটি যে বর্তমান কার্য ডিরেক্টরিটি /, তাই এর vol1সাথে সম্পর্কিত /, যা সমাধান করে /vol1। আপনি ব্যবহার করেন তাহলে WORKDIRকাজ ছাড়া অন্য ডাইরেক্টরি নির্দিষ্ট করতে /, vol1এবং /vol1এখন আর একই ডিরেক্টরির নির্দেশ করবে।
সেবাস্তিয়ান

41

VOLUMEডকফাইফিলের মধ্যে একটি লাইন উল্লেখ করা আপনার চিত্রটিতে কিছুটা মেটাডেটা কনফিগার করে, তবে কীভাবে সেই মেটাডেটা ব্যবহার করা হয় তা গুরুত্বপূর্ণ।

প্রথমত, এই দুটি লাইনটি কী করেছিল:

WORKDIR /usr/src/app
VOLUME . /usr/src/app

সেখানে উপস্থিত WORKDIRরেখাটি ডিরেক্টরিটি তৈরি করে যদি এটি বিদ্যমান না থাকে এবং সমস্ত আপেক্ষিক পাথ নির্দিষ্ট করতে কিছু চিত্র মেটাডেটা আপডেট করে এবং বর্তমান ডিরেক্টরিটি যেমন কমান্ডের জন্য RUNথাকে সেই জায়গায় থাকবে। VOLUMEলাইন আছে দুই খন্ড নির্দিষ্ট করে এক আপেক্ষিক পথ, ., এবং অন্যান্য হয় /usr/src/appউভয় ঠিক একই ডিরেক্টরির হতে ঘটতে। প্রায়শই VOLUMEলাইনটিতে কেবল একটি একক ডিরেক্টরি থাকে তবে এতে আপনি যেমনটি করেছেন তেমন একাধিক থাকতে পারে, বা এটি একটি জসন ফর্ম্যাট অ্যারে হতে পারে।

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

ভলিউম লাইন কী করে? উল্লিখিত হিসাবে, এটি চিত্রের অভ্যন্তরে ডিরেক্টরিটি ভলিউম বলে কিছু চিত্র মেটাডেটা সেট করে। এই মেটাটাটা কীভাবে ব্যবহৃত হয়? প্রতিবার আপনি এই চিত্র থেকে একটি ধারক তৈরি করার সময় ডকার সেই ডিরেক্টরিটিকে একটি ভলিউম হিসাবে বাধ্য করবে। আপনি যদি আপনার রান কমান্ডে কোনও ভলিউম সরবরাহ না করেন বা ফাইল রচনা করেন তবে ডকারের একমাত্র বিকল্প হ'ল একটি বেনামি ভলিউম তৈরি করা। নামের জন্য এটি একটি দীর্ঘ অনন্য আইডি সহ স্থানীয় নামযুক্ত ভলিউম এবং কেন এটি তৈরি করা হয়েছে বা এতে কী ডেটা রয়েছে তার কোনও ইঙ্গিত নেই (বেনামে ভলিউম ছিল ডেটা নষ্ট হয়ে যায়)। আপনি যদি নাম বা হোস্ট ভলিউমের দিকে ইঙ্গিত করে ভলিউমটিকে ওভাররাইড করে থাকেন তবে পরিবর্তে আপনার ডেটা সেখানে যাবে।

ভলিউম জিনিসগুলি বিরতি দেয়: আপনি একবার ডকফেরফায়লে সংজ্ঞায়িত ভলিউমটি অক্ষম করতে পারবেন না। এবং আরও গুরুত্বপূর্ণ বিষয়, RUNঅস্থায়ী পাত্রে কমান্ড ইন ডকার প্রয়োগ করা হয় er এই অস্থায়ী পাত্রে একটি অস্থায়ী বেনাম ভলিউম পাবেন। সেই অনামী ভলিউমটি আপনার চিত্রের বিষয়বস্তু দিয়ে শুরু করা হবে। আপনার RUNকমান্ড থেকে ধারকটির অভ্যন্তরের যে কোনও লেখাগুলি সেই ভলিউমে পরিণত হবে। যখন RUNকমান্ড শেষ, ইমেজ করা পরিবর্তন সংরক্ষিত হয়, এবং বেনামী ভলিউম পরিবর্তন বাতিল করা হয়। এ কারণে, আমি VOLUMEডকফাইফিলের অভ্যন্তরে কোনও সংজ্ঞা দেওয়ার বিরুদ্ধে দৃ strongly়ভাবে প্রস্তাব দিই। এটি আপনার চিত্রের ডাউনস্ট্রিম ব্যবহারকারীদের জন্য অপ্রত্যাশিত আচরণের ফলাফল করে যা ভলিউমের অবস্থানের প্রাথমিক ডেটা সহ চিত্রটি প্রসারিত করতে চায়।

কিভাবে আপনি একটি ভলিউম নির্দিষ্ট করা উচিত? আপনি যেখানে আপনার চিত্রের সাথে ভলিউম অন্তর্ভুক্ত করতে চান তা নির্দিষ্ট করতে একটি সরবরাহ করুন docker-compose.yml। ব্যবহারকারীরা স্থানীয় পরিবেশে ভলিউম অবস্থানটি সামঞ্জস্য করতে এটিকে সংশোধন করতে পারে এবং এটি অন্যান্য রানটাইম সেটিংস যেমন প্রকাশনা বন্দর এবং নেটওয়ার্কিং ক্যাপচার করে।

কেউ এই নথি করা উচিত! তাদের আছে. ডকারে ডকফাইফাইলে তাদের ডকুমেন্টেশনে ভলিউম ব্যবহারের বিষয়ে সতর্কতা সহ রানটাইমের সময় উত্স নির্দিষ্ট করার পরামর্শ সহ অন্তর্ভুক্ত রয়েছে :

  • ডকফাইফাইলের মধ্যে থেকে ভলিউম পরিবর্তন করা: যদি কোনও বিল্ড স্টেপগুলি ঘোষণার পরে ভলিউমের মধ্যে ডেটা পরিবর্তন করে তবে সেই পরিবর্তনগুলি বাতিল করা হবে।

...

  • হোস্ট ডিরেক্টরিটি কনটেইনার রান-টাইমে ঘোষণা করা হয়: হোস্ট ডিরেক্টরি (মাউন্টপয়েন্ট) তার প্রকৃতির দ্বারা, হোস্ট-নির্ভর। এটি চিত্রের বহনযোগ্যতা সংরক্ষণের জন্য, যেহেতু প্রদত্ত হোস্ট ডিরেক্টরিটি সমস্ত হোস্টে উপলব্ধ থাকার গ্যারান্টি দেওয়া যায় না। এই কারণে, আপনি ডকস্পাইলের মধ্যে থেকে কোনও হোস্ট ডিরেক্টরি মাউন্ট করতে পারবেন না। VOLUME নির্দেশ কোন উল্লেখ সমর্থন করে না host-dirপ্যারামিটার। আপনি যখন পাত্রে তৈরি করবেন বা চালাবেন তখন আপনাকে অবশ্যই মাউন্টপয়েন্টটি নির্দিষ্ট করতে হবে।

36

VOLUMEএকটি কমান্ড Dockerfileএকেবারে জরিমানা ব্যবহার করার জন্য, বেশ পাঠ্য পুরোপুরি প্রচলিত হয় এবং এটি যাহাই হউক না কেন অবচিত করা হয় না। শুধু এটি বুঝতে হবে।

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

কমান্ডটি কেবল একটি পরম প্রয়োজন; ধারকটির মধ্যে থেকে WORKDIRযদি সেট করা হয় তার তুলনায় কোনও ফোল্ডারের পাথ । তারপরে ডকার তার গ্রাফে (/ var / lib / ডকার) একটি ভলিউম তৈরি করবে এবং এটি পাত্রে ফোল্ডারে মাউন্ট করবে। এখন উচ্চতর পারফরম্যান্স সহ ধারকটির কাছে কোথাও লিখতে হবে। VOLUMEকমান্ড ব্যতীত নির্দিষ্ট ফোল্ডারে লেখার গতি খুব ধীর হবে কারণ এখন ধারক নিজের ধারকটিতে এটি copy on writeকৌশল ব্যবহার করছে। copy on writeকৌশল একটি প্রধান কারণ ভলিউম অস্তিত্ব নেই।

আপনি যদি VOLUMEকমান্ড দ্বারা নির্দিষ্ট ফোল্ডারের উপরে মাউন্ট করেন , কমান্ডটি কখনই চালিত হয় না কারণ VOLUMEকেবলমাত্র ধারক শুরু হওয়ার পরে কার্যকর হয়, যেমন ধরণের ENV

মূলত VOLUMEকমান্ডের সাহায্যে আপনি কোনও ভলিউম মাউন্ট না করেই পারফরম্যান্স পাবেন। কোনও বাহ্যিক মাউন্ট ছাড়াই ডেটা কন্টেইনার রানগুলিতে খুব সাশ্রয় করবে। তারপরে প্রস্তুত হয়ে গেলে কেবল তার উপর কিছু মাউন্ট করুন।

কিছু ভাল উদাহরণ ব্যবহার ক্ষেত্রে:
- লগ
- টেম্প ফোল্ডার

কিছু খারাপ ব্যবহারের ক্ষেত্রে:
- স্থির ফাইল
- কনফিগার
- কোড


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

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

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

33

volumeডকফাইফিলের নির্দেশকে আরও ভালভাবে বুঝতে , আসুন আমরা mysql অফিসিয়াল ডকার ফাইল প্রয়োগের টিপিক্যাল ভলিউম ব্যবহার শিখি।

VOLUME /var/lib/mysql

তথ্যসূত্র: https://github.com/docker-library/mysql/blob/3362baccb4352bcf0022014f67c1ec7e6808b8c5/8.0/ ডকফেরাইল

/var/lib/mysqlমাইএসকিউএল এর ডিফল্ট অবস্থান যে ডেটা সঞ্চয় ফাইল হয়।

আপনি যখন পরীক্ষার উদ্দেশ্যে কেবল পরীক্ষার ধারক চালান, আপনি এটির মাউন্টিং পয়েন্ট উল্লেখ করতে পারেন না, যেমন

docker run mysql:8

তারপরে volumeমাইএসকিএল কনটেইনার উদাহরণটি ডিফল্ট মাউন্ট পাথটি ব্যবহার করবে যা নির্দেশ দ্বারা ডকফাইফায়লে নির্দিষ্ট করা হবে । ভলিউমগুলি ডকার মূলের অভ্যন্তরে খুব দীর্ঘ আইডি-জাতীয় নাম দিয়ে তৈরি করা হয়, এটি "নামবিহীন" বা "বেনামে" ভলিউম বলে called অন্তর্নিহিত হোস্ট সিস্টেম / var / lib / ডকার / ভলিউমের ফোল্ডারে।

/var/lib/docker/volumes/320752e0e70d1590e905b02d484c22689e69adcbd764a69e39b17bc330b984e4

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

একটি আনুষ্ঠানিক ব্যবহারের জন্য, আপনাকে নামযুক্ত ভলিউম বা বাইন্ড মাউন্ট ব্যবহার করে মাউন্ট পাথ নির্দিষ্ট করতে হবে, যেমন

docker run  -v /my/own/datadir:/var/lib/mysql mysql:8

কমান্ডটি অন্তর্ভুক্ত হোস্ট সিস্টেম থেকে / আমার / নিজস্ব / ডাটাডির ডিরেক্টরিটি কনটেইনারটির ভিতরে / var / lib / mysql হিসাবে মাউন্ট করে data ডাটা ডিরেক্টরি / আমার / নিজের / ডাটাডির স্বয়ংক্রিয়ভাবে মোছা হবে না, এমনকি ধারকটি মোছা হবে।

মাইএসকিএল অফিসিয়াল চিত্রের ব্যবহার (দয়া করে "ডেটা কোথায় সঞ্চয় করবেন" বিভাগটি দেখুন):

তথ্যসূত্র: https://hub.docker.com/_/mysql/


2
আমি আপনার ব্যাখ্যা খুব পছন্দ।
লুকাশজটারাস্ক্কা

তবে ডকার যেভাবেই পরিবর্তনগুলি সংরক্ষণ করে। এছাড়াও আপনি -vডকফাইফাইল
আলেক্স78191

1

আমি ভলিউমের ব্যবহার কোনও ক্ষেত্রেই ভাল বিবেচনা করি না, যদি আপনি নিজের জন্য কোনও চিত্র তৈরি করেন এবং অন্য কেউ এটি ব্যবহার না করে except

বেস ইমেজগুলিতে প্রকাশিত ভলিউমের কারণে আমি নেতিবাচকভাবে প্রভাবিত হয়েছি এবং ইমেজটি ইতিমধ্যে চলার পরে সমস্যাটি সম্পর্কে কেবল জানতে পেরেছি, যেমন ওয়ার্ডপ্রেস যা /var/www/htmlফোল্ডারটিকে ভলিউম হিসাবে ঘোষণা করে এবং এর অর্থ এই যে কোনও ফাইল সংযুক্ত বা পরিবর্তিত হয়েছে বিল্ড স্টেজ বিবেচনা করা হয় না, এবং লাইভ পরিবর্তনগুলি অবিরত থাকে, এমনকি যদি আপনি না জানেন। অন্য জায়গায় ওয়েব ডিরেক্টরি সংজ্ঞায়িত করার জন্য একটি কুৎসিত কাজ রয়েছে, তবে এটি একটি সহজ সমাধানের জন্য একটি খারাপ সমাধান মাত্র: ভলিউম নির্দেশিকা সরিয়ে ফেলুন।

আপনি -vবিকল্পটি সহজেই ব্যবহার করে ভলিউমের উদ্দেশ্য অর্জন করতে পারেন , এটি কেবল এটি পরিষ্কার করে দেয় না যে ধারকটির ভলিউমগুলি কী হবে (ডকফাইফিল এবং পিতামহীন ডকফায়াইলগুলি একবার না দেখে) তবে এটি গ্রাহককে বিকল্পটিও দেয় ভলিউম ব্যবহার করুন বা না।

নিম্নলিখিত কারণে VOLUMES ব্যবহার করা মূলত খারাপ, কারণ এই উত্তরে বলা হয়েছে :

তবে, ভলিউম নির্দেশনাটি ব্যয় করে আসে।

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

পরবর্তী ইস্যুগুলির ফলাফলগুলির মতো সমস্যাগুলি।

একটি ভলিউম সাহায্য করবে undeclare করার বিকল্প হচ্ছে, কিন্তু আপনি শুধুমাত্র যদি জানেন ভলিউম dockerfile যে ইমেজ জেনারেট সংজ্ঞায়িত (এবং পিতা বা মাতা dockerfiles!)। তদ্ব্যতীত, একটি ডকফেরফিলের নতুন সংস্করণগুলিতে একটি ভলিউম যুক্ত করা যেতে পারে এবং চিত্রের গ্রাহকদের জন্য অপ্রত্যাশিতভাবে জিনিসগুলি ভাঙ্গতে পারে।

আরেকটি ভাল ব্যাখ্যা ( VOLUME রয়েছে এমন ওরাকল চিত্র সম্পর্কে , যা সরানো হয়েছিল ): https://github.com/oracle/docker-images/issues/640#issuecomment-412647328

VOLUME লোকদের জন্য স্টাফ ভেঙেছে এমন আরও কয়েকটি ক্ষেত্রে:

একটি পুল অনুরোধ অপশন বৈশিষ্ট্যাবলী (ভলিউম সহ) পিতা বা মাতা ইমেজ পুনরায় সেট করতে যোগ করতে বন্ধ ছিল ও আলোচনা করা হচ্ছে এখানে (এবং আপনি দেখতে পারেন বিভিন্ন ক্ষেত্রে এর মানুষ dockerfiles সংজ্ঞায়িত ভলিউম কারণে বিরূপ প্রভাবিত), যা একটি আছে মন্তব্য একটি ভাল সঙ্গে ভলিউমের বিরুদ্ধে ব্যাখ্যা:

ডকফেরলে ভলিউম ব্যবহার করা মূল্যহীন। যদি কোনও ব্যবহারকারীর অধ্যবসায় প্রয়োজন হয় তবে নির্দিষ্ট ধারকটি চালনার সময় তারা ভলিউম ম্যাপিং সরবরাহ করতে নিশ্চিত হবে। এটি অনুসন্ধান করা খুব কঠিন ছিল যে আমার ডিরেক্টরিটির মালিকানা (/ var / lib / infxdb) সেট করতে না পারার বিষয়টি ইন্ফ্লুডডিবি'র ডকফেরফায়লে ভলিউম ঘোষণার কারণে হয়েছিল। একটি UNVOLUME ধরণের বিকল্প ছাড়া বা এটি থেকে সম্পূর্ণরূপে মুক্তি পাওয়া ছাড়া, আমি নির্দিষ্ট ফোল্ডারের সাথে সম্পর্কিত কিছু পরিবর্তন করতে অক্ষম। এটি আদর্শের চেয়ে কম নয়, বিশেষত যখন আপনি সুরক্ষা-সচেতন হন এবং নির্দিষ্ট ইউআইডি নির্দিষ্ট করার ইচ্ছার চিত্রটি আপনার হোস্টে সফ্টওয়্যার চলমান প্রয়োজন থেকে বেশি এলোমেলো করে, এলোমেলো ব্যবহারকারীকে এড়ানোর জন্য চালানো উচিত।

আমি এক্সপোসকেও খারাপ বলে বিবেচনা করি তবে এর কম পার্শ্ব প্রতিক্রিয়া রয়েছে। ভলিউম এবং এক্সপোজ সম্পর্কে আমি দেখতে পাচ্ছি কেবলমাত্র ডকুমেন্টেশন সম্পর্কে, এবং আমি তাদের ভাল বিবেচনা করব যদি তারা কেবল এটির জন্য পরিবেশন করেন (কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই)।

টি এল; ডিআর

আমি বিবেচনা করি যে VOLUME এর সেরা ব্যবহারটি হ্রাস করা উচিত।

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