পরিষেবাগুলি শুরু করার পরে ডকার পাত্রে কীভাবে চলতে হবে?


156

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

service supervisor start
service nginx start

এবং আমি এটিকে আমার ডকফাইফিলের ভিতরে এটি শুরু করি:

CMD ["sh", "/root/credentialize_and_run.sh"]

আমি দেখতে পাচ্ছি যে আমি যখন ম্যানুয়ালি জিনিসগুলি চালিত করি তখন পরিষেবাগুলি সমস্ত সঠিকভাবে শুরু হয় (যেমন -i -t / বিন / ব্যাশ দিয়ে চিত্রটিতে চলেছি), এবং চিত্রটি চালানোর সময় সমস্ত কিছু সঠিকভাবে চলেছে বলে মনে হয়, তবে এটি একবারে উপস্থিত হয় এটি আমার প্রক্রিয়া শুরু করে শেষ করে। আমি প্রক্রিয়াগুলি অনির্দিষ্টকালের জন্য চলতে চাই এবং যতদূর আমি বুঝতে পারি, এটি হওয়ার জন্য ধারকটি চালিয়ে যেতে হবে। তবুও, যখন আমি দৌড়ে যাই, docker ps -aআমি দেখতে পাই:

➜  docker_test  docker ps -a
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS                      PORTS               NAMES
c7706edc4189        some_name/some_repo:blah   "sh /root/run-all.sh   8 minutes ago       Exited (0) 8 minutes ago                        grave_jones

কি দেয়? কেন বাইরে বের হচ্ছে? আমি জানি যে আমি এটি চালিয়ে যাওয়ার জন্য আমার বাশ স্ক্রিপ্টের শেষে কিছুক্ষণ লুপ রাখতে পারি, তবে এটিটি বেরিয়ে আসার সঠিক উপায় কী?


1
আপনি কি পরিষেবাগুলির পোর্টগুলি বাইরের দিকে প্রকাশ করছেন (-পি বিকল্পটি ডকার চালানোর জন্য)? (অবশ্যই এটি তাদের প্রস্থান করতে বাধা দেবে না)
ribamar

1
আমি আমার ডকফাইলে ENTRYPOINT ব্যবহার করছিলাম, এবং ENTRYPOINT (আমার init স্ক্রিপ্ট) এ সংজ্ঞায়িত স্ক্রিপ্টটি চলার পরে এটি লগগুলিতে প্রদর্শিত হয়েছিল তবে আমার ধারকটি প্রস্থান হতে দেখে মনে হচ্ছে। সুতরাং, ENTRYPOINT এর পরিবর্তে, আমি স্ক্রিপ্টটি চালাতে RUN কমান্ডটি ব্যবহার করেছি এবং ধারকটি এখনও পটভূমিতে চলছে।
ইফাহালজানী

উত্তর:


50

এটি আপনার ডকারের পাত্রে কীভাবে ডিজাইন করা উচিত তা সত্য নয়।

ডকার কনটেইনার ডিজাইন করার সময়, আপনি এটিকে এমনভাবে তৈরি করার কথা যে সেখানে কেবলমাত্র একটি প্রক্রিয়া চলছে (যেমন আপনার এনগিনেক্সের জন্য একটি ধারক থাকা উচিত, এবং তদারককারী বা অ্যাপটি চালাচ্ছেন); অতিরিক্তভাবে, সেই প্রক্রিয়াটি অগ্রভাগে চালানো উচিত।

প্রক্রিয়াটি নিজে থেকে প্রস্থান করা হলে পাত্রে "প্রস্থান" হবে (আপনার ক্ষেত্রে, সেই প্রক্রিয়াটি আপনার বাশ স্ক্রিপ্ট)।


যাইহোক, যদি আপনি সত্যিই প্রয়োজন (অথবা চান) আপনার Docker কন্টেইনারে একাধিক সেবা চালানোর থেকে শুরু বিবেচনা "Docker বেজ চিত্র" , যা ব্যবহারের runitএকটি সিউডো-init পদ্ধতির হিসাবে ( runitযা থাকবো অনলাইন যখন nginx এবং সুপারভাইজার রান থাকতে হবে) অগ্রভাগে যখন আপনার অন্যান্য প্রক্রিয়াগুলি তাদের কাজ করে।

তাদের কাছে পর্যাপ্ত ডক্স রয়েছে, তাই আপনি যুক্তিসঙ্গতভাবে যা করার চেষ্টা করছেন তা অর্জন করতে সক্ষম হওয়া উচিত।


1
আমার কেন কেবল একটি পরিষেবা চলতে হবে তা আপনি ব্যাখ্যা করতে পারেন? আমি প্রয়োজনে সুপারভাইজারে এনজিনেক্স যুক্ত করতে পারতাম, তবে কেন এটি প্রয়োজনীয় হবে তা নিশ্চিত নই।
এলি

3
@ এলি সংক্ষিপ্ত উত্তরটি হ'ল ডকার এইভাবে কাজ করেন। ডকার কেবলমাত্র একটি কন্টেইনার প্রতি প্রক্রিয়া (এবং তার শিশুদের) চালাবে। এটি সুপারিশ করা হয় যে এই প্রক্রিয়াটি একটি আসল অ্যাপ্লিকেশন প্রক্রিয়া (যাতে এটি যদি প্রস্থান করে তবে ডকার জানেন)) তবে আপনি প্রকৃতপক্ষে সেই প্রক্রিয়া হিসাবে সুপারভাইজার ব্যবহার করতে পারেন। নোট করুন যে আপনাকে অগ্রভাগে চালানোর জন্য সুপারভাইজারকে কনফিগার করতে হবে (অর্থাত না ডেমোনাইজ করুন), যা --nodaemonবিকল্পের মাধ্যমে সম্পন্ন হয়েছে ।
টমাস ওরোজকো

1
@ ইলি এই ডকার ব্লগ পোস্টটি কেসটি তৈরি করে যে একাধিক প্রক্রিয়া চলমান (এবং, স্পষ্টভাবে বলতে গেলে, একটি "ছোট ভিপিএস" হিসাবে একটি ধারক দেখা) suboptimal। আপনার ক্ষেত্রে, মন্তব্য থ্রেড সম্ভবত আসল ব্লগ পোস্টের চেয়ে বেশি প্রাসঙ্গিক হতে পারে।
টমাস অরোজকো

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

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

155

আপনি যদি ডকফাইফিল ব্যবহার করছেন তবে চেষ্টা করুন:

ENTRYPOINT ["tail", "-f", "/dev/null"]

(স্পষ্টতই এটি কেবল দেব উদ্দেশ্যগুলির জন্য, কোনও পাত্রে কোনও প্রক্রিয়া চালিত না করে আপনি জীবিত রাখার দরকার নেই যেমন এনজিন্স ...)


5
আমি ব্যবহার করছিলাম CMD["sleep", "1d"]তবে আপনার সমাধানটি আরও ভাল বলে মনে হচ্ছে
জর্জ প্লিগোরোপ্লোস

@ জর্জিওস প্লিগোরোপুলস এটি এই লাইনে আটকে থাকবে; সম্ভবত পটভূমিতে দৌড়াতে কাজ করবে
প্রশান্ত সামস

5
ব্যবহার করতে পারেন CMD["sleep", "infinity"]
রোমাঁ

5
বা 'বিড়াল' কিন্তু লোকেরা এটি প্রাণী নির্যাতনের কথা বলতে পারে। এক্সডি
আইনফটোগ

আপনি আপনার এন্ট্রিপয়েন্ট স্ক্রিপ্টটি দিয়ে শেষ করতে পারেন exec tail -f /dev/nullতবে tailএন্ট্রিপয়েন্ট হিসাবে ব্যবহার করা একটি ভুল উত্তর।
টর্স্টেন ব্রোঞ্জার

86

আমার ঠিক একই সমস্যা ছিল এবং আমি জানতে পেরেছিলাম যে আপনি যদি নিজের ধারকটি পতাকা -tএবং -dপতাকা দিয়ে চালাচ্ছেন তবে এটি চলতে থাকবে।

docker run -td <image>

পতাকাগুলি এখানে যা করে (অনুযায়ী docker run --help):

-d, --detach=false         Run container in background and print container ID
-t, --tty=false            Allocate a pseudo-TTY

সবচেয়ে গুরুত্বপূর্ণটি হ'ল -tপতাকা। -dকেবল আপনাকে পটভূমিতে ধারক চালাতে দেয়।


3
আমি এটি পুনরুত্পাদন করতে পারি না। আপনি দয়া করে একটি উদাহরণ প্রদান করবেন? এটি কাজ করার জন্য ডকফাইফাইল সম্পর্কে আমাদের নির্দিষ্ট কিছু (যেমন: সিএমডি) দরকার?
ম্যাথিউস সান্টানা

2
এটি আমার পক্ষে কার্যকর হয়নি। আমি কমান্ডটি docker logs <image>নিশ্চিত করেছিলাম এটি নিশ্চিত করার জন্য যে এটি আমার তীরের পাত্রে প্রস্থান করার কারণ হয়েছিল error প্রস্থান স্থিতিটি হ'ল 0এবং সর্বশেষ আউটপুটটি নিশ্চিত হ'ল আমার lighttpdসার্ভারটি চলছে:[ ok ] Starting web server: lighttpd.
ওব 1

আমি এখন কিছুক্ষণ ডকারের সাথে কাজ করছি না। সুতরাং কমান্ড লাইন ইন্টারফেস পরিবর্তিত হয়েছে এবং এই কমান্ডটি আর কাজ করবে না এটি সম্ভব।
arne.z

4
আমি নিশ্চিত করতে পারি যে এটি সত্যই সর্বশেষতম ডকার সংস্করণ নিয়ে কাজ করছে। আপনি যদি এই সেশনে পরে সংযুক্ত করতে চান তবে -ডিট ব্যবহার করাও কাজ করবে।
জন হ্যামিল্টন

1
@ দীর্ঘ সময়ে কোনও স্ক্রিপ্ট টিটিটি গ্রহণ করবে না, শুরু করুন exec bashবা exec shশেষে ইনস্টল করা থাকলে বাশ ইনস্টল করা নেই। তারপরে আপনি -t পতাকাটি ব্যবহার করতে পারেন
123

43

এটি থেকে বেরিয়ে যাওয়ার কারণ হ'ল শেল স্ক্রিপ্টটি পিআইডি 1 হিসাবে প্রথম চালানো হয় এবং এটি শেষ হয়ে গেলে, পিআইডি 1 চলে যায় এবং ডিকার কেবল পিআইডি 1 থাকা অবস্থায় চালিত হয়।

আপনি সমস্ত কিছু করতে সুপারভাইজারকে ব্যবহার করতে পারেন, যদি "-n" পতাকাটি চালানো হয় তবে এটি ডেমোনাইজ করতে না বলা হয়েছে, সুতরাং এটি প্রথম প্রক্রিয়া হিসাবে থাকবে:

CMD ["/usr/bin/supervisord", "-n"]

এবং আপনার তত্ত্বাবধায়ক

[supervisord]
nodaemon=true

[program:startup]
priority=1
command=/root/credentialize_and_run.sh
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
autorestart=false
startsecs=0

[program:nginx]
priority=10
command=nginx -g "daemon off;"
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx.log
autorestart=true

তারপরে আপনি যেমনটি চান তেমন আরও অনেকগুলি প্রক্রিয়া রাখতে পারেন এবং সুপারভাইজার প্রয়োজনে সেগুলি পুনরায় চালু করতে পরিচালনা করবেন।

আপনি nginx এবং php5-fpm প্রয়োজন হতে পারে এমন ক্ষেত্রে আপনি সুপারভাইজার ব্যবহার করতে পারেন এবং এগুলি পৃথক করে রাখার কোনও অর্থ নেই।


ডকগুলিতে কোথায় এটি বলা হয়েছে যদি পিআইডি 1 শেষ হয় ডকার কনটেইনারটি বন্ধ হয়ে যায়?
8oh8

@ 8oh8 এটাই মূলত প্রক্রিয়া নামস্থান কীভাবে কাজ করে; এটি "সমস্ত পাত্রে অন্তর্নিহিত জিনিস" এর মতো ডকার-নির্দিষ্ট নয়। থেকে man7.org/linux/man-pages/man7/pid_namespaces.7.html :If the "init" process of a PID namespace terminates, the kernel terminates all of the processes in the namespace via a SIGKILL signal. This behavior reflects the fact that the "init" process is essential for the correct operation of a PID namespace.
dannysauer

40

আপনি catব্রো @ স'াদ দ্বারা উল্লিখিত কোনও যুক্তি ছাড়াই প্লেইন চালাতে পারেন কেবল কন্টেইনারটি চালিয়ে যেতে [আসলে ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করা ছাড়া কিছুই করছেন না) (জেনকিন্সের ডকার প্লাগইন একই কাজ করে)


আমার জবাব ছাড়াও: তবে বুঝতে পারি যে ডকার-কমপোজ (ডিমনাইজড নয়) আপনাকে আপনার ধারকটির ওয়ার্কফ্লো দেখানোর জন্য ব্যবহৃত হয়, তাই এটি আপনার শুরু করা পরিষেবার লগ ফাইলগুলি টেলিংয়ের পক্ষে কার্যকর হতে পারে। চিয়ার্স
সার্জ ভেলিকানভ

1
বা cat। জেনকিনের ডকার প্লাগইন তাই করে।
সাদ

12

নিশ্চিত হয়ে নিন যে আপনি daemon off;আপনারে nginx.conf যুক্ত করেছেন বা CMD ["nginx", "-g", "daemon off;"]সরকারী এনজিনেক্স চিত্র অনুসারে এটি চালাচ্ছেন

তারপরে সার্ভিস হিসাবে সুপারভাইজার এবং এনজিএনএক্স উভয়কে অগ্রভাগের প্রক্রিয়া হিসাবে চালনার জন্য নিম্নলিখিতটি ব্যবহার করুন যা ধারকটি প্রস্থান করতে বাধা দেবে

service supervisor start && nginx

কিছু ক্ষেত্রে আপনার ধারকটিতে আপনার একাধিক প্রক্রিয়া থাকা দরকার, তাই ধারকটির ঠিক এক প্রক্রিয়া করতে বাধ্য করা কাজ করে না এবং স্থাপনার ক্ষেত্রে আরও সমস্যা তৈরি করতে পারে।

সুতরাং আপনার ট্রেড-অফগুলি বুঝতে হবে এবং সেই অনুযায়ী আপনার সিদ্ধান্ত নেওয়া উচিত।


7

প্রেরণা:

নেই একটি Docker ধারক ভেতরে একাধিক চলমান প্রসেস কিছুই ভুল । কেউ যদি হালকা ওজনের ভিএম হিসাবে ডকার ব্যবহার করতে পছন্দ করেন - তাই হোন। অন্যরা তাদের অ্যাপ্লিকেশনগুলিকে মাইক্রো পরিষেবাগুলিতে ভাগ করতে পছন্দ করে। আমার মনে হয়: একটি পাত্রে একটি ল্যাম্প স্ট্যাক? শুধু মহান.

উত্তর:

ফিউশন বেস ইমেজের মতো ভাল বেস ইমেজ সহ স্টিক করুন । অন্যরাও থাকতে পারে। অনুগ্রহ করে মন্তব্য করুন.

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

ফিউশন চিত্রটি নিজেই শুরু হবে এবং চলতে থাকবে যদি আপনি এই বেসিক ডকার রান স্টেটমেন্টটি জারি করেন:

moin@stretchDEV:~$ docker run -d phusion/baseimage
521e8a12f6ff844fb142d0e2587ed33cdc82b70aa64cce07ed6c0226d857b367
moin@stretchDEV:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
521e8a12f6ff        phusion/baseimage   "/sbin/my_init"     12 seconds ago      Up 11 seconds

বা মৃত সহজ:

যদি কোনও বেস ইমেজটি আপনার জন্য না হয় ... দ্রুত সিএমডি এটি চালিয়ে যাওয়ার জন্য আমি বাশার জন্য এই জাতীয় কিছু মনে করব:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

বা ব্যস্তবক্সের জন্য এটি:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"

এই, চমৎকার, কারণ এটা হবে অবিলম্বে প্রস্থান একটি উপর docker stop। ঠিক প্লেইন sleepবা catধারকটি বের হওয়ার কয়েক সেকেন্ড সময় নেবে।


পোস্টগ্র্রেএসকিউএল ১১ লোড করার জন্য আমি সেন্টোস base বেস চিত্রটি কাস্টমাইজ করেছি You ফাঁদ ব্যবহারের আপনার পরামর্শটি দুর্দান্ত কাজ করেছে; এটা আমার স্ক্রিপ্ট pgstartwait.sh শেষ লাইন
Alchemistmatt

6

ভেরিয়েবলের মধ্যে এনগনিক্সস প্রক্রিয়াটির পিআইডি ক্যাপচার করুন (উদাহরণস্বরূপ $ NGNIX_PID) এবং এন্ট্রিপয়েন্ট ফাইলের শেষে করুন

wait $NGNIX_PID 

এইভাবে, আপনার কনটেইনারটি এনজিনিক্স জীবিত না হওয়া পর্যন্ত চলতে হবে, যখন এনজিনিক্স বন্ধ হয়ে যায়, ধারকটিও থামবে


0

যদি পরিষেবা পাওয়া যায় তবে তত্ত্বাবধানের ফর্মটি কীভাবে ব্যবহার করবেন?

YOUR_SERVICE তত্ত্বাবধান করুন

একবার তদারকি সফলভাবে চলমান থাকলে, এটি হত্যা না করা বা বিশেষত প্রস্থান করার জন্য বলা না হলে এটি প্রস্থান করবে না।

একটি তৈরি করে সংরক্ষণ করে supervisord.conf

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