ফাইল পরিবর্তনগুলিতে ডকার ধারক পুনর্নির্মাণ করুন


93

একটি এএসপি.নেট কোর অ্যাপ্লিকেশন চালানোর জন্য, আমি একটি ডকস্পিল তৈরি করেছি যা অ্যাপ্লিকেশনটি তৈরি করে এবং ধারকটিতে উত্স কোডটি অনুলিপি করে, যা জিনকিনস ব্যবহার করে গিট দ্বারা প্রাপ্ত। সুতরাং আমার কর্মক্ষেত্রে, আমি ডকফেরফিলের মধ্যে নিম্নলিখিতগুলি করি:

WORKDIR /app
COPY src src

জেনকিন্স আমার হোস্টের ফাইলগুলি গিটের সাথে সঠিকভাবে আপডেট করলেও ডকার আমার চিত্রটিতে এটি প্রয়োগ করে না।

নির্মাণের জন্য আমার প্রাথমিক লিপি:

#!/bin/bash
imageName=xx:my-image
containerName=my-container

docker build -t $imageName -f Dockerfile  .

containerRunning=$(docker inspect --format="{{ .State.Running }}" $containerName 2> /dev/null)

if [ "$containerRunning" == "true" ]; then
        docker stop $containerName
        docker start $containerName
else
        docker run -d -p 5000:5000 --name $containerName $imageName
fi

আমি বিভিন্ন জিনিস পছন্দ চেষ্টা --rmএবং --no-cacheজন্য পরামিতি docker runএবং বাঁধন / ধারক সরানোর আগে নতুন এক বিল্ড। আমি নিশ্চিত না যে আমি এখানে কী ভুল করছি। মনে হচ্ছে ডকার চিত্রটি সঠিকভাবে আপডেট করছে, কারণ কলটির COPY src srcফলে কোনও লেয়ার আইডি হবে এবং কোনও ক্যাশে কল হবে না:

Step 6 : COPY src src
 ---> 382ef210d8fd

একটি ধারক আপডেট করার প্রস্তাবিত উপায় কী?

আমার সাধারণ দৃশ্যটি হ'ল: অ্যাপ্লিকেশনটি একটি ডকারের ধারক মধ্যে সার্ভারে চলছে। এখন অ্যাপ্লিকেশনটির কিছু অংশ আপডেট করা হয়েছে, যেমন কোনও ফাইল পরিবর্তন করে। এখন ধারকটি নতুন সংস্করণ চালানো উচিত। ডকার মনে হয় একটি বিদ্যমান পাত্রে পরিবর্তন করার পরিবর্তে একটি নতুন চিত্র তৈরি করার পরামর্শ দিচ্ছে, তাই আমি মনে করি আমার মতো পুনর্নির্মাণের সাধারণ পদ্ধতিটি সঠিক, তবে বাস্তবায়নের কয়েকটি বিশদ উন্নত করতে হবে।


প্রতিটি কমান্ড থেকে আপনার বিল্ড কমান্ড এবং পুরো আউটপুট সহ আপনি আপনার ধারকটি তৈরি করতে ঠিক পদক্ষেপগুলি তালিকাভুক্ত করতে পারেন?
বিএমইচ

উত্তর:


140

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

অপসারণ কেন প্রয়োজন

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

পাত্রে স্থায়ী হওয়ার কারণে আপনাকে docker rm <ContainerName>প্রথমে সেগুলি সরিয়ে ফেলতে হবে । একটি ধারক অপসারণের পরে, আপনি এটিকে কেবল এটিকে শুরু করতে পারবেন না docker start। এটি ব্যবহার করে করতে হবে docker run, যা নিজেই নতুন ধারক-উদাহরণ তৈরির জন্য সর্বশেষ চিত্রটি ব্যবহার করে।

পাত্রে যতটা সম্ভব স্বাধীন হওয়া উচিত

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

সুতরাং কনটেইনার থেকে এই তথ্যগুলি সম্পূর্ণরূপে বাদ দেওয়ার জন্য এটি একটি স্মার্ট সমাধান: যখন আমাদের ডেটাটি হোস্ট এবং কনটেইনারটিতে নিরাপদে সঞ্চিত থাকে কেবল তখনই আমাদের ডেটা নিয়ে চিন্তা করতে হবে না।

কেন -rfআপনাকে সত্যিই সাহায্য করতে পারে না

docker runকমান্ড একটি আছে ক্লিন আপ সুইচ বলা -rf। এটি স্থায়ীভাবে ডকার পাত্রে রাখার আচরণ বন্ধ করবে। ব্যবহার করে -rf, ডকার বাইরে বেরিয়ে যাওয়ার পরে ধারকটি ধ্বংস করবে। তবে এই স্যুইচটিতে দুটি সমস্যা রয়েছে:

  1. ডকার কনটেইনারটির সাথে সম্পর্কিত কোনও নাম ছাড়া ভলিউমগুলিও সরিয়ে ফেলুন, যা আপনার ডেটা মেরে ফেলতে পারে
  2. এই বিকল্পটি ব্যবহার করে, -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

এটি নিখুঁতভাবে কাজ করে :)


4
'আমি খুঁজে পেয়েছি যে ডকারের পাত্রে আজীবন সম্পর্কে আমার কিছু ভুল ধারণা রয়েছে' আপনি এই শব্দটি আমার মুখ থেকে বের করে নিয়েছেন। এই ধরণের বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। আমি newbies ডকার এটি সুপারিশ করব। এটি ভিএম বনাম ধারকটির পার্থক্য পরিষ্কার করে।
ভিন্স ব্যানসন

4
আপনার ব্যাখ্যার পরে, আমি যা করেছি তা হল আমার বিদ্যমান চিত্রটিতে আমি কী করেছি তা নোট নেওয়া take পরিবর্তনগুলি ধরে রাখতে, আমি একটি নতুন চিত্র তৈরি করতে একটি নতুন ডকফায়াইল তৈরি করেছি যা ইতিমধ্যে আমার যুক্ত হওয়া পরিবর্তনগুলি অন্তর্ভুক্ত করে। এইভাবে, তৈরি নতুন চিত্রটি (কিছুটা) আপডেট হয়েছে।
ভিন্স ব্যানসন

কি --force-recreateDocker রচনা বিকল্পটি তুমি এখানে কি বর্ণনা মত? এবং যদি তা হয় তবে এর পরিবর্তে এই সমাধানটি ব্যবহার করা কি উপযুক্ত হবে না (দুঃখিত যদি সেই প্রশ্নটি বোবা হয় তবে আমি একটি ডকার
নুব

4
@ সিগ্লেসেট হ্যাঁ, এটি একই রকম, সরাসরি তুলনামূলক নয়। তবে docker-composeএটি প্লেইন dockerকমান্ডের চেয়ে স্মার্ট । আমি নিয়মিত কাজ করি docker-composeএবং পরিবর্তন সনাক্তকরণ ভাল কাজ করে, তাই আমি --force-recreateখুব কমই ব্যবহার করি । শুধু docker-compose up --buildগুরুত্বপূর্ণ যখন আপনি (একটি কাস্টম চিত্র নির্মাণের করছি buildরচনা ফাইলে নির্দেশিকা) পরিবর্তে Docker হাব যেমন থেকে একটি চিত্র ব্যবহার করে।
সিংহ

35

ডকস্পাইল বা রচনা বা প্রয়োজনীয়তাগুলিতে যখনই পরিবর্তন করা হয় তখন এটি ব্যবহার করে এটি আবার চালান docker-compose up --build। যাতে চিত্রগুলি পুনর্নির্মাণ এবং সতেজতা পেতে পারে


4
মাইএসকিউএল ডকার একটি ধারক হিসাবে একটি পরিষেবা হিসাবে, ডিবি খালি খালি পরে যদি কেউ এর জন্য একটি ভলিউম ব্যবহার করে /opt/mysql/data:/var/lib/mysql?
মার্টিন থোমা

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

1

আপনি পরিষেবাটির নামটি কীভাবে আপনার ডকার-রচনা ফাইলটিতে এটি কল করেছিলেন তা মিলিয়ে buildচলতে docker-compose up --build <service name>গিয়ে আপনি কোনও নির্দিষ্ট পরিষেবায় দৌড়াতে পারেন ।

উদাহরণ আসুন অনুমান আপনার Docker-রচনা ফাইল অনেক পরিষেবা রয়েছে (.net অ্যাপ - ডাটাবেস - আসুন এনক্রিপ্ট ... ইত্যাদি) এবং আপনি যা নামে শুধুমাত্র .net অ্যাপ আপডেট করতে চান applicationDocker-রচনা ফাইলে। আপনি তারপর চালাতে পারেনdocker-compose up --build application

অতিরিক্ত পরামিতি আপনি যদি আপনার কমান্ডে অতিরিক্ত পরামিতি যুক্ত করতে চান যেমন -dব্যাকগ্রাউন্ডে চলার জন্য, প্যারামিটারটি পরিষেবার নামের আগে হওয়া উচিত: docker-compose up --build -d application

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