একটি আলাদা কমান্ড দিয়ে থামানো ডকার পাত্রটি কীভাবে শুরু করবেন?


251

আমি ডিফল্ট কমান্ড ক্র্যাশ হওয়ার সাথে সাথে একটি পৃথক কমান্ডের সাহায্যে একটি থামানো ডকার ধারক শুরু করতে চাই - যার অর্থ আমি ধারকটি শুরু করতে পারি না এবং তারপরে 'ডকার এক্সিকিউট' ব্যবহার করতে পারি না।

মূলত আমি একটি শেল শুরু করতে চাই যাতে আমি ধারকটির সামগ্রীগুলি পরীক্ষা করতে পারি।

ভাগ্যক্রমে আমি -টি বিকল্পটি দিয়ে পাত্রে তৈরি করেছি!

উত্তর:


380

আপনার থামানো ধারক আইডি সন্ধান করুন

docker ps -a

থামানো ধারকটির প্রতিশ্রুতিবদ্ধ:

এই কমান্ডটি পরিবর্তিত ধারক অবস্থাকে একটি নতুন চিত্রে সংরক্ষণ করে user/test_image

docker commit $CONTAINER_ID user/test_image

একটি পৃথক এন্ট্রি পয়েন্ট দিয়ে শুরু / চালান:

docker run -ti --entrypoint=sh user/test_image

এন্ট্রিপয়েন্টের যুক্তি বর্ণনা: https://docs.docker.com/engine/references/run/#/entryPoint-default-command-to-execute-at-runtime

বিঃদ্রঃ:

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

থামানো ধারক শুরু করার পদক্ষেপগুলি এখান থেকে ধার করা হয়েছে: (শেষ মন্তব্য) https://github.com/docker/docker/issues/18078


1
না, চিত্রগুলি কেবল পঠনযোগ্য। এটি পরিবর্তিত কনটেইনার রাজ্যটিকে একটি নতুন চিত্রের পরীক্ষার চিত্রে সংরক্ষণ করে
দিমিত্রিউসান

4
এটি এনভি, ভলিউম, ইউআইডি, প্রায় সমস্ত কনফিগারেশন মিস করে ... থামানো ধারকটির সাথে এটির সাথে মিল রয়েছে সমস্ত ফাইল সিস্টেম (যা সম্ভবত কিছুর পক্ষে যথেষ্ট)
ফ্লোরিয়ান ক্লেইন

4
আমি যদি কোনওভাবে একই পরিবেশ, নেটওয়ার্ক কনফিগারেশন, সংযুক্ত ভলিউম পেতে পারি তবে এটি দুর্দান্ত হবে। inspectপরবর্তী রান দিয়ে ব্যবহৃত আউটপুটটি কোনও কনফিগারেশনে রূপান্তর করা সম্ভব ?
ওথিয়াস

2
@ ওয়েবেম্যান, হ্যাঁ, তবে এটি কোনও ধারক থামানোর আগে যে ভলিউমগুলি মাউন্ট করা হয়েছিল তার পক্ষে এটি সত্য নয়। আপনি পরের বার কন্টেইনারটি শুরু করার সময় আপনাকে একই ভলিউম সংযুক্ত করতে হবে
দিমিত্রিউসান

1
@ এমরেটাপসি, আমি মনে করি এটি করা ডকার আদর্শের বিরুদ্ধে। কনটেইনারগুলি ভার্চুয়াল মেশিনের বিপরীতে একটি গানে ব্যবহারযোগ্য রান এবং থ্রো-এউন্ড সত্তা হিসাবে তৈরি। আপনি aaa90210 উত্তর অনুসরণ করার চেষ্টা করতে পারেন , তবে এটি হ্যাক হবে।
দিমিত্রিউসন

126

এই ফাইলটি সম্পাদনা করুন (আপনার থামানো ধারকটির সাথে সম্পর্কিত):

vi /var/lib/docker/containers/923...4f6/config.json

আপনার নতুন কমান্ডের দিকে নির্দেশ করতে "পাথ" পরামিতি পরিবর্তন করুন, যেমন / বিন / ব্যাশ। আপনি কমান্ডের সাথে যুক্তিগুলি সরবরাহ করতে "আরগস" পরামিতিটিও সেট করতে পারেন।

ডকার পরিষেবাটি পুনরায় চালু করুন (নোট করুন এটি সমস্ত চলমান পাত্রে থামবে):

service docker restart

আপনার পাত্রে তালিকাভুক্ত করুন এবং নিশ্চিত করুন যে আদেশটি পরিবর্তিত হয়েছে:

docker ps -a

ধারকটি শুরু করুন এবং এতে সংযুক্ত করুন, আপনার এখন শেল থাকা উচিত!

docker start -ai mad_brattain

ডকার 1.7.1 ব্যবহার করে ফেডোরা 22 তে কাজ করেছেন।

দ্রষ্টব্য: যদি আপনার শেলটি ইন্টারেক্টিভ না হয় (উদাহরণস্বরূপ আপনি -it বিকল্পের সাহায্যে মূল ধারকটি তৈরি করেন নি), আপনি পরিবর্তে "/ বিন / স্লিপ 600" বা "/ বিন / পুচ্ছ -f / দেব / নাল" এ আদেশটি পরিবর্তন করতে পারেন শেল পাওয়ার অন্য উপায় হিসাবে আপনাকে "ডকার এক্সিকিউটিভ-কনটাইড / বিন / বাশ" করার জন্য পর্যাপ্ত সময় দেওয়ার জন্য।

দ্রষ্টব্য: ডকারের নতুন সংস্করণগুলিতে config.v2.json রয়েছে, যেখানে আপনাকে এন্ট্রিপয়েন্ট বা সিএমডি (ইউজার 60561 ধন্যবাদ) পরিবর্তন করতে হবে।


44
আমার চোখ. আমার চোখ. আমি আশা করি এটি ডকারে সঠিকভাবে পরিচালনা করার জন্য এটি কোথাও একটি বৈশিষ্ট্য অনুরোধ।
gertvdijk

2
@ অ্যালেক্সিস্ট্রখ আপনি "/ usr / bin / ঘুম 600" চালানোর চেষ্টা করতে পারেন এবং তারপরে শেল পেতে "ডকার এক্সিকিউটিউট-বিট / ব্যাশ" করতে পারেন। যদিও আমি নিশ্চিত না যে কীভাবে সেই পথের চলকটিতে পরামিতি স্থাপন করা যায়। অন্যথায় চেষ্টা করুন এবং অন্য একটি আদেশ সন্ধান করুন যা আপনাকে মৃত্যুদণ্ড কার্যকর করার জন্য বা দীর্ঘস্থায়ীভাবে জীবিত থাকতে পারে, বা দিমিত্রিউসানের উত্তর দেখুন।
aaa90210

3
এই প্রশ্নের একমাত্র সত্যই উত্তর: অন্য সমস্ত প্রস্তাব একটি "প্রায় একই" ধারক চালায় তবে তারা ভলিউমগুলি ভুলে যায়, এনভি, ইউআইডি, ...
ফ্লোরিয়ান ক্লেইন

3
আমার ক্ষেত্রে / usr / বিন / ঘুম উপলব্ধ ছিল না। আমার সফলতা ছিল..."Path":"tail","Args":["-f","/dev/null"]...
নেভ্রোম

4
Docker -এর একটি নবীনতর সংস্করণ আছে config.v2.json, যেখানে আপনি পরিবর্তন করতে পারেন প্রয়োজন হবে Entrypointবা Cmd
ব্যবহারকারী 60561

20

আপনার এন্ট্রিপয়েন্ট স্ক্রিপ্টের শীর্ষে একটি চেক যুক্ত করুন

ডকারকে সত্যই এটি একটি নতুন বৈশিষ্ট্য হিসাবে বাস্তবায়িত করা দরকার, তবে পরিস্থিতিগুলির জন্য এখানে আপনার আরও একটি বিকল্প বিকল্প রয়েছে যেখানে আপনার একটি এন্ট্রিপয়েন্ট রয়েছে যা সাফল্য বা ব্যর্থতার পরে শেষ হয়, যা ডিবাগ করা কঠিন করে তুলতে পারে।

আপনার যদি ইতিমধ্যে কোনও এন্ট্রিপয়েন্ট স্ক্রিপ্ট না থাকে তবে এমন একটি তৈরি করুন যা আপনার ধারকটির জন্য যা যা কমান্ড (গুলি) চালায় runs তারপরে, এই ফাইলের শীর্ষে, এই লাইনগুলি এতে যুক্ত করুন entrypoint.sh:

# Run once, hold otherwise
if [ -f "already_ran" ]; then
    echo "Already ran the Entrypoint once. Holding indefinitely for debugging."
    cat
fi
touch already_ran

# Do your main things down here

catসংযোগটি ধরে রেখেছে তা নিশ্চিত করার জন্য , আপনাকে একটি টিটিওয়াই সরবরাহ করতে হবে। আমি আমার এন্ট্রিপয়েন্ট স্ক্রিপ্টটির সাথে ধারকটি চালাচ্ছি:

docker run -t --entrypoint entrypoint.sh image_name

এর ফলে স্ক্রিপ্টটি একবার চালানো হবে এবং এমন একটি ফাইল তৈরি করা হবে যা ইঙ্গিত করে যে এটি ইতিমধ্যে চলছে (কনটেইনার ভার্চুয়াল ফাইল সিস্টেমে)। তারপরে আপনি ডিবাগিং সম্পাদন করার জন্য ধারকটি পুনরায় চালু করতে পারেন:

docker start container_name

আপনি যখন already_ranধারকটি পুনরায় চালু করবেন তখন ফাইলটি পাওয়া যাবে যার ফলে এন্ট্রিপয়েন্ট স্ক্রিপ্টটি আটকে catথাকবে (যা কেবলমাত্র ইনপুটটির জন্য চিরকাল অপেক্ষা করে যা কখনই আসবে না, তবে ধারকটি জীবিত রাখে)। তারপরে আপনি একটি ডিবাগিং bashসেশনটি কার্যকর করতে পারেন :

docker exec -i container_name bash

ধারকটি চলমান অবস্থায়, আপনি যদি আবার সেইরূপে ডিবাগ করার প্রয়োজন হয় তবে আপনি পুনরায় পুনরায় চালনার already_ranজন্য entrypoint.shস্ক্রিপ্টটি সরিয়ে ফেলতে এবং নিজে চালিত করতে পারেন can


3
অতিরিক্তভাবে, আপনি এন্ট্রিপয়েন্টের /bin/shপরিবর্তে রান catকরতে পারেন - তারপরে আপনি সর্বদা পুনরায় চালু হতে পারেন। আপনার সমাধান শিলা!
ড্যানি দুলাই

4

আমার সমস্যা:

  • আমি দিয়ে একটি পাত্রে শুরু docker run <IMAGE_NAME>
  • এবং তারপরে এই ধারকটিতে কিছু ফাইল যুক্ত করা হয়েছে
  • তারপরে আমি ধারকটি বন্ধ করে দিয়ে আবার চেষ্টা করেছি উপরের মত একই কমান্ড।
  • তবে আমি যখন নতুন ফাইলগুলি চেক করেছি, সেগুলি অনুপস্থিত ছিল
  • আমি যখন চালাতাম তখন আমি docker ps -aদুটি পাত্রে দেখতে পেতাম।
  • এর অর্থ প্রতিবার আমি docker run <IMAGE_NAME>কমান্ড চালাচ্ছিলাম , নতুন চিত্র তৈরি হচ্ছে

সমাধান: আপনি প্রথম স্থানে তৈরি একই ধারকটিতে কাজ করতে এই পদক্ষেপগুলি অনুসরণ করুন

  • docker ps আপনার ধারক পাত্রে পেতে
  • docker container start <CONTAINER_ID> বিদ্যমান ধারক শুরু করতে
  • তারপরে আপনি যেখানে রেখেছিলেন সেখান থেকে চালিয়ে যেতে পারেন। যেমনdocker exec -it <CONTAINER_ID> /bin/bash
  • তারপরে আপনি এটির বাইরে একটি নতুন চিত্র তৈরি করার সিদ্ধান্ত নিতে পারেন

এটি প্রশ্নের উত্তর দেয় না। ওপি কীভাবে কনটেইনারটি পুনরায় চালু করতে হবে তা জানতে docker run <containerID>
চেয়েছে তবে ব্যবহারকারীর

2

আমি @ দিমিত্রিউসনের উত্তর নিয়ে এটিকে একটি উপাধিতে পরিণত করেছি:

ওরফে ডকার-রান-অ্যাভ-কনটেইনার = 'prev_container_id = "$ (ডকার পিএস -এক | হেড-এন 1)" && ডকার কমিট / $ prev_container_id " '

এটি আপনার ~/.bashrcএলিয়াস ফাইলগুলিতে যুক্ত করুন, এবং আপনার কাছে একটি নিফটি নতুন docker-run-prev-containerএলিফ থাকবে যা আপনাকে পূর্ববর্তী ধারকটির শেলের মধ্যে ফেলে দেবে।

ডিবাগ করার জন্য সহায়ক ব্যর্থ docker buildগুলি।


2

এটি আপনি যা চেয়েছিলেন ঠিক তা নয়, তবে docker exportফাইলগুলি পরীক্ষা করা যদি আপনি চান তবে আপনি একটি থামানো পাত্রে ব্যবহার করতে পারেন ।

mkdir $TARGET_DIR
docker export $CONTAINER_ID | tar -x -C $TARGET_DIR

1

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

সাথে ধারক আইডি পান docker ps

docker exec -it 665b4a1e17b6 /bin/sh

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

ডকার এক্সের জন্য দস্তাবেজ - https://docs.docker.com/engine/references/commandline/exec/

ডকার সংযুক্তির জন্য দস্তাবেজ - https://docs.docker.com/engine/references/commandline/attach/


-12

আমি আসলে এই দুটি উত্তরের সাথে একমত নই। যদি আপনি কেবল ধারকটিতে কী দেখতে চান তবে শেলটি পেতে আপনি এই আদেশটি চালাতে পারেন। কোনও এন্ট্রিপয়েন্ট বা কোনও কনফিগারেশন পরিবর্তন করার দরকার নেই।

docker run -it <image_name> bash

12
অপ্টটি কোনও চিত্র নয়, কোনও ধারক সম্পর্কে জিজ্ঞাসা করছে বলে এটি কাজ করে না।
পিটার ভ্যাবেল 21

আমি আপনার অধিকার মনে করি তবে এটি করার কোনও কারণ দেখতে পাচ্ছি না। আপনি স্টাগআউটে লগগুলি পাইপ করতে পারেন এবং docker logs <container_id> --followআপনার যা প্রয়োজন তা আপনাকে দেবেন। অন্য বিকল্পটি হ'ল উপরের কমান্ডটি ব্যবহার করুন তারপরে সেই চিত্রটিতে ক্রমিকিং পরিষেবাটি ডকফাইফিলে একই কমান্ড দিয়ে শুরু করুন এবং সেখান থেকে ডিবাগ করুন।
deadbabykitten

4
রান কমান্ডটি একটি চিত্র থেকে একটি নতুন ধারক তৈরি করে। এটি কোনও থামানো ধারক শুরু করে না।
ওয়ালিদ আবদুল্লা

2
উম্মম, .. ডকারের বিন্দুটি হ'ল না যে প্রতিটি চিত্র ঠিক একইভাবে কাটা যায়? এটি আপনার যুক্তি উপেক্ষা করে। তিনি থামানো ধারক শুরু করার প্রয়োজন নেই। যে কোনও ধারক হুবহু হ'ল তাই সে কোনটি শুরু করে বা থামায় তা আসলে বিবেচ্য নয়। তিনি কেবল বিষয়গুলি খতিয়ে দেখার চেষ্টা করছেন। সবচেয়ে সহজ উপায় হ'ল লগগুলিতে কমান্ডের কমান্ড বা পাইপ আউটপুট চালানো এবং চালানো। আপনি ছেলেরা মাঝে মাঝে সহজ সমস্যার জন্য সবচেয়ে জটিল সমাধান নিয়ে আসেন।
ডেডবাইকিটেন

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