সংক্ষেপে: না, আপনার 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
পাত্রটি চালানোর সময় লোকেরা বিকল্পটি ব্যবহার করতে ভুলে যেতে পারে । কেউ হয়ত ধারকটি সরিয়ে ফেলতে পারে তবে ভলিউমটি সরিয়ে দিতে ভুলবেন না। এছাড়াও, সর্বোপরি মানব স্মৃতিশক্তি থাকা সত্ত্বেও, সমস্ত বেনামী ভলিউমগুলির মধ্যে কোনটি অপসারণ করা নিরাপদ তা নির্ধারণ করা একটি কঠিন কাজ হতে পারে।