কিছু গবেষণা এবং পরীক্ষার পরে, আমি দেখতে পেলাম যে ডকারের পাত্রগুলির জীবনকাল সম্পর্কে আমার কিছু ভুল ধারণা রয়েছে। ইতিমধ্যে কন্টেইনারটি পুনরায় চালু করার ফলে ডকার একটি নতুন চিত্র ব্যবহার করে না, যখন এর মধ্যে চিত্রটি আবার তৈরি করা হয়েছিল। পরিবর্তে, ডকার কেবল ধারক তৈরি করার আগে চিত্রটি আনছে । সুতরাং একটি ধারক চালানোর পরে রাজ্য অধ্যবসায়ী।
অপসারণ কেন প্রয়োজন
অতএব, পুনর্নির্মাণ এবং পুনঃসূচনা যথেষ্ট নয়। আমি ভেবেছিলাম পাত্রে কোনও পরিষেবার মতো কাজ করা হয়: পরিষেবাটি বন্ধ করা, আপনার পরিবর্তনগুলি করুন, এটি পুনরায় আরম্ভ করুন এবং তারা প্রয়োগ করবে। এটা আমার সবচেয়ে বড় ভুল ছিল।
পাত্রে স্থায়ী হওয়ার কারণে আপনাকে docker rm <ContainerName>
প্রথমে সেগুলি সরিয়ে ফেলতে হবে । একটি ধারক অপসারণের পরে, আপনি এটিকে কেবল এটিকে শুরু করতে পারবেন না docker start
। এটি ব্যবহার করে করতে হবে docker run
, যা নিজেই নতুন ধারক-উদাহরণ তৈরির জন্য সর্বশেষ চিত্রটি ব্যবহার করে।
পাত্রে যতটা সম্ভব স্বাধীন হওয়া উচিত
এই জ্ঞানের সাহায্যে, এটি বোধগম্য যে কেন পাত্রে ডেটা সংরক্ষণ করা খারাপ অভ্যাস হিসাবে যোগ্য এবং ডকার তার পরিবর্তে ডেটা ভলিউম / মাউন্ট হোস্ট ডিরেক্টরগুলির প্রস্তাব দেয় : যেহেতু অ্যাপ্লিকেশনগুলি আপডেট করার জন্য একটি ধারককে নষ্ট করতে হবে, তাই ভিতরে সঞ্চিত তথ্যও হারিয়ে যাবে be এটি শাটডাউন পরিষেবাদি, ব্যাকআপ ডেটা ইত্যাদিতে অতিরিক্ত কাজ করে।
সুতরাং কনটেইনার থেকে এই তথ্যগুলি সম্পূর্ণরূপে বাদ দেওয়ার জন্য এটি একটি স্মার্ট সমাধান: যখন আমাদের ডেটাটি হোস্ট এবং কনটেইনারটিতে নিরাপদে সঞ্চিত থাকে কেবল তখনই আমাদের ডেটা নিয়ে চিন্তা করতে হবে না।
কেন -rf
আপনাকে সত্যিই সাহায্য করতে পারে না
docker run
কমান্ড একটি আছে ক্লিন আপ সুইচ বলা -rf
। এটি স্থায়ীভাবে ডকার পাত্রে রাখার আচরণ বন্ধ করবে। ব্যবহার করে -rf
, ডকার বাইরে বেরিয়ে যাওয়ার পরে ধারকটি ধ্বংস করবে। তবে এই স্যুইচটিতে দুটি সমস্যা রয়েছে:
- ডকার কনটেইনারটির সাথে সম্পর্কিত কোনও নাম ছাড়া ভলিউমগুলিও সরিয়ে ফেলুন, যা আপনার ডেটা মেরে ফেলতে পারে
- এই বিকল্পটি ব্যবহার করে,
-d
স্যুইচ ব্যবহার করে পটভূমিতে পাত্রে চালানো সম্ভব নয়
-rf
দ্রুত পরীক্ষার জন্য বিকাশের সময় কাজের সাশ্রয় করার জন্য স্যুইচটি একটি ভাল বিকল্প, যদিও এটি উত্পাদনে কম উপযুক্ত। বিশেষত ব্যাকগ্রাউন্ডে একটি ধারক চালানোর জন্য বিকল্পটি নিখোঁজ হওয়ার কারণে, যা বেশিরভাগ ক্ষেত্রে প্রয়োজন হবে।
কিভাবে একটি ধারক অপসারণ
কেবল ধারকটি সরিয়ে আমরা এই সীমাবদ্ধতাগুলি বাইপাস করতে পারি:
docker rm --force <ContainerName>
--force
(অথবা -f
যা পাত্রে চালনাকারী কোনো SIGKILL ব্যবহার করুন) সুইচ। পরিবর্তে, আপনি এর আগে পাত্রে থামাতে পারেন:
docker stop <ContainerName>
docker rm <ContainerName>
উভয়ই সমান। সাইনটারমওdocker stop
ব্যবহার করছে । তবে --force
সুইচ ব্যবহার করা আপনার স্ক্রিপ্টটি ছোট করবে, বিশেষত সিআই সার্ভার ব্যবহার করার সময়: docker stop
ধারকটি চলমান না থাকলে একটি ত্রুটি নিক্ষেপ করে। এটি জেনকিনস এবং অন্যান্য অনেক সিআই সার্ভারগুলির ফলে বিল্ডটিকে ভুলভাবে ব্যর্থ হিসাবে বিবেচনা করবে। এটি ঠিক করার জন্য, আপনাকে প্রথমে পরীক্ষা করে দেখতে হবে যে কন্টেইনারটি আমি যেমন প্রশ্নে করেছি ( containerRunning
চলক দেখুন) তেমন চলছে ।
ডকার পাত্রে পুনর্নির্মাণের জন্য সম্পূর্ণ স্ক্রিপ্ট
এই নতুন জ্ঞান অনুসারে, আমি আমার স্ক্রিপ্টটি নিম্নলিখিত উপায়ে স্থির করেছি:
#!/bin/bash
imageName=xx:my-image
containerName=my-container
docker build -t $imageName -f Dockerfile .
echo Delete old container...
docker rm -f $containerName
echo Run new container...
docker run -d -p 5000:5000 --name $containerName $imageName
এটি নিখুঁতভাবে কাজ করে :)