কেন ডকারের ধারক তাত্ক্ষণিকভাবে প্রস্থান করে


239

আমি ব্যাকগ্রাউন্ডে একটি ধারক ব্যবহার করছি

 docker run -d --name hadoop h_Service

এটি দ্রুত প্রস্থান করে। তবে আমি যদি অগ্রভাগে চালাই তবে এটি ঠিকঠাক কাজ করে। আমি লগগুলি ব্যবহার করে পরীক্ষা করেছি

docker logs hadoop

কোন ত্রুটি ছিল না। কোন ধারনা?

DOCKERFILE

 FROM java_ubuntu_new
 RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
 RUN dpkg -i cdh4-repository_1.0_all.deb
 RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add -
 RUN  apt-get update
 RUN apt-get install -y hadoop-0.20-conf-pseudo
 RUN dpkg -L hadoop-0.20-conf-pseudo
 USER hdfs
 RUN hdfs namenode -format
 USER root
 RUN apt-get install -y sudo
 ADD . /usr/local/
 RUN chmod 777 /usr/local/start-all.sh
 CMD ["/usr/local/start-all.sh"]

start-all.sh

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start
 /etc/init.d/hadoop-hdfs-datanode start
 /etc/init.d/hadoop-hdfs-secondarynamenode start
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start
 sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start
 /bin/bash

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

আপনি যা অর্জনের আশা করছেন chmod 777তা অনিরাপদ এবং ভুল। আপনার বুদ্ধিমান অনুমতিগুলিতে ফিরে আসা উচিত (সম্ভবত এই ক্ষেত্রে 755)।
ট্রিপল

উত্তর:


125

ডকারের ধারকটির মূল প্রক্রিয়া শেষ হলে এটি প্রস্থান করে।

এই ক্ষেত্রে আপনার start-all.shস্ক্রিপ্ট শেষ হয়ে গেলে এটি প্রস্থান করবে exit এই ক্ষেত্রে এটি কীভাবে করা যায় তা আপনাকে জানাতে আমি হ্যাডুপ সম্পর্কে যথেষ্ট জানি না, তবে প্রক্রিয়াগুলি চালনার জন্য আপনাকে অগ্রভাগে কিছু চালিয়ে যাওয়া বা প্রসেস ম্যানেজার যেমন রানিট বা সুপারভাইজার ব্যবহার করতে হবে।

আমি মনে করি আপনি নির্দিষ্ট করে না রেখে কাজ করা সম্পর্কে আপনার অবশ্যই ভুল হতে হবে -d; এটি ঠিক একই প্রভাব হওয়া উচিত। আমার সন্দেহ হয় আপনি কিছুটা আলাদা কমান্ড দিয়ে বা এটি ব্যবহার করে -itযা কিছু পরিবর্তন করবে তা দিয়ে আপনি এটি চালু করেছিলেন I

একটি সহজ সমাধান হতে পারে এর মতো কিছু যুক্ত করা:

while true; do sleep 1000; done

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

(আমি এই কোডটি https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh থেকে চুরি করেছি বলেছি )


217

এটি আমার জন্য কৌশলটি করেছে:

docker run -dit ubuntu

এটির পরে, আমি ব্যবহার করে প্রক্রিয়াগুলি পরীক্ষা করেছিলাম:

docker ps -a

আবার ধারক সংযুক্ত করার জন্য

docker attach CONTAINER_NAME

টিপ: ধারক প্রকারটি বন্ধ না করে প্রস্থান করার জন্য: ^P^Q


15
@Tommy থেকে docs.docker.com/engine/reference/commandline/run -d, বিচ্ছিন্ন মোডে --detach: ব্যাকগ্রাউন্ডে রান কমান্ড -i, --interactive Keep এর stdin খুলতে এমনকি যদি সংযুক্ত না, -t, - - ছদ্ম- -dit

3
@ am17torres ঠিক আছে, দুঃখিত আমার বিভ্রান্তিকর প্রশ্নটি পরিষ্কার করে দিন; d বিচ্ছিন্ন এবং আমি ইন্টারেক্টিভ, তাই ডি এবং আমি এর সংমিশ্রণটি আমার কাছে বিভ্রান্তিকর। আমি ভেবেছিলাম ডি এটি ব্যাকগ্রাউন্ড (অ-ইন্টারেক্টিভ) প্রক্রিয়া হিসাবে চালু করবে।
টমি

2
@ টমি যখন এই বিকল্পগুলি একত্রিত হয়, পাত্রে পটভূমিতে ইন্টারেক্টিভ মোডে প্রবেশ করবে ।
ইয়োন

2
@ টমি, @ এএম 17 টটারস -diসর্বনিম্ন প্রয়োজনীয়, -tবিকল্পটি যখন অপ্রয়োজনীয় তখন -dআমি সঠিকভাবে বুঝতে পারলে অপ্রয়োজনীয়
রেনেদ

2
আসলে আপনি যদি সক্ষম না করে পুনরায় যোগাযোগ করেন তবে আপনি আপনার প্রম্পটটি দেখতে সক্ষম হবেন না -t... তবে যেহেতু আমি execপ্রতিবারই লক্ষ্য করি না ততবারই আমি একটি নতুন ব্যাশ পাই। আমার ম্যাক থেকে আলাদা করার সমস্যা হয়েছিল তবে আমি সম্ভবত এটি ভুল করছি ..
রেনাউড

65

আমি বলতে চাই বা সাহস করতে চাই, ক্যাম্পোসার দ্বারা উল্লিখিত উত্তরটি উন্নত করুন

আপনি যখন দৌড়াবেন

docker run -dit ubuntu

আপনি মূলত ইন্টারেক্টিভ মোডে পটভূমিতে ধারক চালাচ্ছেন।

আপনি যখন সিটিআরএল + ডি (এটি করার সর্বাধিক সাধারণ উপায়) দ্বারা ধারকটি সংযুক্ত এবং প্রস্থান করবেন তখন আপনি ধারকটি থামান কারণ আপনি কেবলমাত্র মূল প্রক্রিয়াটি মেরেছেন যা আপনি উপরের কমান্ড দিয়ে আপনার ধারকটি শুরু করেছিলেন।

ইতিমধ্যে চলমান ধারকটির সুবিধার্থে আমি ব্যাশের আরও একটি প্রক্রিয়া কাঁটাচামচ করে চালিয়ে একটি ছদ্ম টিটিওয়াই পেতে চাই:

docker exec -it <container ID> /bin/bash

29

আমি যখনই স্ক্রিনটি সম্পাদন করে শেষ করি তখন কোনও পাত্রে থাকতে হবে

&& tail -f /dev/null

কমান্ড শেষে। সুতরাং এটি হওয়া উচিত:

/usr/local/start-all.sh && tail -f /dev/null

19

ডকারের ধারক তাত্ক্ষণিকভাবে প্রস্থান করল কেন?

আপনি যদি চিত্রটি চারদিকে ঝুলতে বাধ্য করতে চান (কোনও কিছু ডিবাগ করতে বা ফাইল সিস্টেমের অবস্থা পরীক্ষা করতে) আপনি এন্টি পয়েন্টটিকে শেল পরিবর্তন করতে ওভাররাইড করতে পারেন:

docker run -it --entrypoint=/bin/bash myimagename

18

আপনার প্রসেস এবং পরিষেবাগুলি সেগুলি পটভূমিতে চলমান শুরু করা এবং wait [n ...]আপনার স্ক্রিপ্টের শেষে কমান্ডটি ব্যবহার করা একটি দুর্দান্ত উপায় হবে । ব্যাশে, ওয়েট কমান্ড বর্তমান প্রক্রিয়াটিকে এতে বাধ্য করে:

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

আমি এই ধারণাটি সাবস্টিয়ান পুজাদাসের এল্ক বিল্ডের জন্য শুরু স্ক্রিপ্ট থেকে পেয়েছি ।

আসল প্রশ্নটি গ্রহণ করে, আপনার সূচনা-সমস্ত.শ কিছু দেখতে এমন হবে ...

 #!/usr/bin/env bash
 /etc/init.d/hadoop-hdfs-namenode start &
 /etc/init.d/hadoop-hdfs-datanode start &
 /etc/init.d/hadoop-hdfs-secondarynamenode start &
 /etc/init.d/hadoop-0.20-mapreduce-tasktracker start &
 sudo -u hdfs hadoop fs -chmod 777 /
 /etc/init.d/hadoop-0.20-mapreduce-jobtracker start &
 wait

5

এটি ডকফাইফিলের শেষে যুক্ত করুন:

CMD tail -f /dev/null

নমুনা ডকার ফাইল:

FROM ubuntu:16.04

# other commands

CMD tail -f /dev/null

উল্লেখ


CMD tail -f /dev/nullএটি মাধ্যমে চালানো sh -c "..."execপরিবর্তে আমরা ফর্মটি ব্যবহার করতে পারি ? অর্থাৎCMD ["tail", "-f", "/dev/null"]
মেগলিও

4

আমার অভ্যাসটি ডকফাইফাইল একটি শেল শুরু করে যা অবিলম্বে প্রস্থান করবে না CMD [ "sh", "-c", "service ssh start; bash"], তারপরে চালাও docker run -dit image_name। এইভাবে (ssh) পরিষেবা এবং ধারকটি চলছে।


1

আমি readশেষে শেল স্টেটমেন্ট যুক্ত । এটি কনটেইনারটির প্রধান প্রক্রিয়াটি - স্টার্টআপ শেল স্ক্রিপ্ট - চলমান রাখে।



1

আপনি যদি পাত্রে থেকে ডকফায়াইল পরীক্ষা করেন তবে উদাহরণস্বরূপ fballiano / magento2-apache-php

আপনি দেখতে পাবেন যে তাঁর ফাইলের শেষে তিনি নিম্নলিখিত কমান্ডটি যুক্ত করেছেন: সত্য যদিও; ঘুমাও 1; সম্পন্ন

এখন, আমি যা প্রস্তাব দিচ্ছি তা হ'ল আপনি এটি করেন

docker container ls --all | grep 127

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


0

ডকারকে তাত্ক্ষণিকভাবে প্রস্থান করার জন্য সম্ভাব্য অনেকগুলি উপায় রয়েছে। আমার জন্য, এটি আমার সমস্যা ছিল Dockerfile। সেই ফাইলটিতে একটি বাগ ছিল। আমার ENTRYPOINT ["dotnet", "M4Movie_Api.dll]পরিবর্তে ছিল ENTRYPOINT ["dotnet", "M4Movie_Api.dll"]। আপনি দেখতে পাচ্ছেন যে আমি শেষে একটি উদ্ধৃতি (") মিস করেছি।

সমস্যাটি বিশ্লেষণ করতে আমি আমার ধারকটি শুরু করেছি এবং দ্রুত আমার ধারকটি সংযুক্ত করেছি যাতে আমি দেখতে পাই যে সঠিক সমস্যাটি কী।

C:\SVenu\M4Movie\Api\Api>docker start 4ea373efa21b


C:\SVenu\M4Movie\Api\Api>docker attach 4ea373efa21b

যেখানে 4ea373efa21b আমার কনটেইনার আইডি। এটি আমাকে আসল ইস্যুতে চালিত করে।

এখানে চিত্র বর্ণনা লিখুন

সমস্যাটি সন্ধান করার পরে, আমাকে আবার আমার ধারকটি তৈরি করতে, পুনরুদ্ধার করতে হবে, প্রকাশ করতে হবে।


0

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

সহজ কথায়, যদি আপনার হয়

my-main-thing &

তারপরে হয় &অগ্রভাগে কাজ চালানোর জন্য বাইরে বেরোন, বা যুক্ত করুন

wait

স্ক্রিপ্ট শেষে এটি সমস্ত পটভূমি কাজের জন্য অপেক্ষা করা।

এটির পরে যদি মূল কাজের চাপটি প্রস্থান হয় তবে এটি প্রস্থান করবে, তাই while trueএটি চিরতরে পুনরায় আরম্ভ করতে বাধ্য করার জন্য এটি একটি লুপে চালান :

while true; do
    my-main-thing &
    other things which need to happen while the main workload runs in the background
    maybe if you have such things
    wait
done

(কীভাবে লিখবেন তাও লক্ষ্য করুন while truesil এমন নির্বোধ বিষয়গুলি দেখতে সাধারণ while [ true ]বা while [ 1 ]যা কাকতালীয়ভাবে কাজ হওয়ার সাথে সাথে দেখা সাধারণ বিষয় , তবে লেখক সম্ভবত তাদের কী বোঝাতে হবে তা কল্পনা করেননি))


0

আপনার এটি ডি-ফ্ল্যাগ দিয়ে চালানো দরকার এটি পটভূমিতে ডেমন হিসাবে চলমান রাখতে।

ডকার রান -ড-উবুন্টু বাশ


-5

আপনি এই পুনরায় আরম্ভ পতাকা ব্যবহার করে ধারক চালাতে পারেন।

docker run -d --name=<some-name> -p xxxx:xxxx ... <image-name> --restart=unless-stopped

-8

যেহেতু চিত্রটি একটি লিনাক্স, তাই কনটেইনারটিতে ব্যবহৃত কোনও শেল স্ক্রিপ্টগুলির ইউনিক্স লাইনের শেষ রয়েছে কিনা তা পরীক্ষা করে দেখার একটি জিনিস রয়েছে। যদি তাদের শেষে একটি ^ এম থাকে তবে সেগুলি উইন্ডোজ লাইন সমাপ্তি। এগুলি ঠিক করার একটি উপায় হ'ল উইন্ডোজ থেকে ইউনিক্সে রূপান্তর করার জন্য /usr/local/start-all.sh এ ডস 2 ইউনিক্স দিয়ে। ইন্টারেক্টিভ মোডে ডকার চালানো অন্যান্য সমস্যাগুলি সনাক্ত করতে সহায়তা করতে পারে। আপনার একটি ফাইলের নাম টাইপো বা কিছু থাকতে পারে। দেখতে https://en.wikipedia.org/wiki/Newline

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