ডকারের ধারক চালানোর সময় কীভাবে স্বয়ংক্রিয়ভাবে কোনও পরিষেবা শুরু করবেন?


157

আমার একটি পাত্রে মাইএসকিউএল সার্ভার ইনস্টল করার জন্য একটি ডকফাইফিল রয়েছে, যা আমি এর পরে শুরু করি:

sudo docker run -t -i 09d18b9a12be /bin/bash

তবে মাইএসকিউএল পরিষেবা স্বয়ংক্রিয়ভাবে শুরু হয় না, আমাকে ম্যানুয়ালি চালাতে হবে (ধারক থেকে):

service mysql start

আমি ডক কনটেইনারটি চালানোর সময় আমি কীভাবে স্বয়ংক্রিয়ভাবে মাইএসকিউএল পরিষেবা শুরু করব?


1
না, একটি সাধারণ পরিষেবার জন্য, তদারকির প্রয়োজন নেই, এটি ব্যবহারকারীর জন্য জটিল করে তোলে
ল্যারি

8
আপনি এখানে নেই এমন কোনও ফাইলের সাথে লিঙ্ক করার পরিবর্তে ডকফাইফিলটি এখানে অনুলিপি করতে চান
neo112

সুপারভাইজারে ডকার নিবন্ধটি এখন এখানে রয়েছে: ডকস.ডকার / কনফিগ / কনটেনারস / মাল্টি- সার্ভিস_কন্টেনার আমার পরিষেবাটি কাজ করতে আমি && লেজ কমান্ডটি ব্যবহার করেছি - তবে ডকরে "--cap-add SYS_PTRACE" যুক্ত করা দরকার আপনার আদেশ প্রদান করুন.
টেড কাহাল

উত্তর:


205

প্রথমত, আপনার এখানে একটি সমস্যা রয়েছে Dockerfile:

RUN service mysql restart && /tmp/setup.sh

ডকার চিত্রগুলি চলমান প্রক্রিয়াগুলি সংরক্ষণ করে না। সুতরাং, আপনার RUNকমান্ড কেবল docker buildপর্বের সময় কার্যকর হয় এবং বিল্ডটি সমাপ্ত হওয়ার পরে বন্ধ হয়ে যায়। পরিবর্তে, ধারকটি নীচের মত CMDবা ENTRYPOINTকমান্ড ব্যবহার করে শুরু করার সময় আপনাকে কমান্ডটি নির্দিষ্ট করতে হবে :

CMD mysql start

দ্বিতীয়ত, ডকার পাত্রে চালিয়ে যেতে একটি প্রক্রিয়া (শেষ কমান্ড) প্রয়োজন, অন্যথায় ধারকটি প্রস্থান / প্রস্থান করবে। সুতরাং service mysql startডকফাইলে সরাসরি কমান্ড ব্যবহার করা যায় না।

সমাধান

প্রক্রিয়াটি চালিয়ে যাওয়ার জন্য তিনটি সাধারণ উপায় রয়েছে:

  • ব্যবহার serviceযে মত পরে কমান্ড পরিশেষে যোগ অ শেষ কমান্ডtail -F

    CMD service mysql start && tail -F /var/log/mysql/error.log
    

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

  • অথবা এটি করতে ফোরগ্রাউন্ড কমান্ড ব্যবহার করুন

    CMD /usr/bin/mysqld_safe
    

স্ক্রিপ্টের মতো হলেই এটি কাজ করে mysqld_safe

  • অথবা আপনার স্ক্রিপ্টগুলি মোড়ানো start.shএবং এটিকে শেষ করে দিন

    CMD /start.sh
    

কমান্ডটি অবশ্যই /start.shচলমান থাকা উচিত , যদি কমান্ডটি অবশ্যই কয়েকটি ধাপ অনুসরণ করে This

বিঃদ্রঃ

শিক্ষানবিসের জন্য ব্যবহারের supervisordপরামর্শ দেওয়া হয় না। সত্য, এটি ওভারকিল। ধারকটির জন্য একক পরিষেবা / একক কমান্ড ব্যবহার করা আরও ভাল।

বিটিডাব্লু: অনুগ্রহ করে রেফারেন্সের জন্য বিদ্যমান মাইএসকিএল ডকার চিত্রের জন্য দয়া করে https://registry.hub.docker.com দেখুন


ডক পাত্রে একবার আপনি কীভাবে পরিষেবাটি পুনরায় চালু করবেন?
কে - এসও-তে বিষক্রিয়া বাড়ছে।

3
@ কার্লমরিসনdocker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
কায়সার

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

আমি নিশ্চিত না কেন, তবে প্রথম সমাধান বিকল্পটি পরিষেবা স্ক্রিপ্টের জন্য ভাল কাজ করে। আপনি যখন লেজ ব্যবহার করবেন না, এটি ব্যর্থ হবে, যদিও পরিষেবা শুরু করা হয়েছে (কমপক্ষে tomcat7 পরিষেবার জন্য)। লেজ দিয়ে এটি কাজ করে। উভয় ক্ষেত্রেই আপনাকে সুইচ ক্যাপ_এডড ব্যবহার করতে হবে (- রান করার জন্য ক্যাপ-অ্যাড এসওয়াইএসপিটিআরসিইইএস) কমপক্ষে এসওয়াইএসপ্যাট্রিএসিই
zhrist


73

আপনার মধ্যে Dockerfile, শেষ লাইনে যুক্ত করুন

ENTRYPOINT service ssh restart && bash

এটা আমার জন্য কাজ করে

এবং এই ফলাফল:

root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
 * Restarting OpenBSD Secure Shell server sshd   [ OK ]                                                                      
root@dccc354e422e:~# service ssh status
 * sshd is running

2
এটি দুর্দান্ত তবে আমি মনে করি আপনি এইভাবে কোনও বিচ্ছিন্ন ধারক রাখতে পারবেন না।
এমডব

1
এটি আমার জন্য কাজ করে মহান। অ্যান্টি শুরু করার জন্য Nginx 1.8 পেতে আমার সমস্যা হচ্ছে। আপনি নিম্নলিখিত সাহায্যকারী যোগ করতে পারেন: আরুন ইকো "ডিমন বন্ধ;" >> /etc/nginx/nginx.conf চালান Ln -sf, / dev / stdout- এ /var/log/nginx/access.log চালান Ln -sf, / dev / দ্বারা stderr /var/log/nginx/error.log
লিওনেল মরিসন

1
এই সমাধানে কোনও ত্রুটি আছে কি?
srph

2
শুরু হচ্ছে ব্যাশ পরিশেষে একটি খারাপ ধারণা যখন আপনি অত্যন্ত শৃঙ্খলার আপনার পরিষেবার থামাতে কারণ এই ভাবে Docker contaienr দ্বারা বন্ধ করা যাবে না চান docker stopবা docker restartঅত্যন্ত শৃঙ্খলার, শুধুমাত্র নিহত হতে পারে।
মোহাম্মদ নুরাল্ডিন

আমি ডকারের চিত্রগুলি তৈরি করতে প্যাকারটিতে কাজ করছিলাম এবং এটি প্যাকার ফাইলটিতে কনাইটনারের সাথে আমার সমস্যাটি সমাধান করার বিষয়টি মনে হচ্ছে। "পরিবর্তনগুলি": ["ENTRYPOINT পরিষেবা nginx শুরু && / বিন / বাশ"]
karthik101

8

সরল! ডকফাইফাইলের শেষে যুক্ত করুন:

ENTRYPOINT service mysql start && /bin/bash

এটি আমার বর্তমান ডকার কনটেইনার সমস্যাটি সমাধান করে এমন সেরা উত্তর: পরিষেবা Docker version 18.09.7, build 2d0083dছাড়াই && /bin/bashতাত্ক্ষণিক বন্ধ হয়ে যাবে
দীর্ঘ

7

এটি করার আরও একটি উপায় আছে যা আমি সবসময় আরও বেশি পঠনযোগ্য বলে মনে করি।

বলুন যে আপনি এটি চালানোর সময় খরগোশ এবং মংডোব শুরু করতে চান তবে আপনার CMDদেখতে এইরকম কিছু দেখাবে:

CMD /etc/init.d/rabbitmq-server start && \
    /etc/init.d/mongod start

আপনি যদি শুধুমাত্র একটি থাকতে পারে যেহেতু CMDপ্রতি Dockerfileকৌতুক দিয়ে সমস্ত নির্দেশাবলী কনক্যাটেনেট হয় &&এবং তারপর ব্যবহার \প্রতিটি কমান্ড জন্য একটি নতুন লাইন শুরু করা হবে।

যদি আপনি তাদের মধ্যে অনেকগুলি যোগ করেন তবে আমি পরামর্শ দিচ্ছি যে আপনি আপনার সমস্ত কমান্ডগুলি স্ক্রিপ্ট ফাইলে রেখেছেন এবং এটি @ লরি-ক্যা প্রস্তাবিত মত শুরু করুন:

CMD /start.sh

3

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

#!/bin/sh

set -e

echo "Starting the mysql daemon"
service mysql start

echo "navigating to volume /var/www"
cd /var/www
echo "Creating soft link"
ln -s /opt/mysite mysite

a2enmod headers
service apache2 restart

a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload

if [ -z "$1" ]
then
    exec "/usr/sbin/apache2 -D -foreground"
else
    exec "$1"
fi

এটি আপনার ডকফেরাইলের পাশাপাশি রাখুন। তারপরে আপনার ডকফাইফিলে আপনার একটি নির্দেশ থাকা উচিত যা এই ফাইলটি পছন্দসই জায়গায় অনুলিপি করে। তারপরে আপনি ENTRYPOINT ['your location']স্ক্রিপ্ট ফাইলটিতে নির্দেশটি নির্দেশ করুন। আপনার স্ক্রিপ্টে নির্বাহের অনুমতিগুলি সেট করতে ভুলবেন না। COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]। এই উদাহরণে, আমি ডক পাত্রে আমার এন্ট্রি পয়েন্টটি মূল ডিরেক্টরিতে অনুলিপি করেছি।
মিঃ ডুমসবাস্টার

ডকফেরাইল কোথায়?
ভিক্টর জোরাস

3

আমি স্বয়ংক্রিয়ভাবে এসএসএস পরিষেবা শুরু করতে চাইলে আমার একই সমস্যা হয়। আমি যে সংযোজন পেয়েছি

/etc/init.d/ssh শুরু করুন
প্রতি
~ / .Bashrc
এটি সমাধান করতে পারে, তবে কেবল আপনি এটি খোলার মাধ্যমেই তা করবে।


1

আমি একবারে কোডটি চালানোর জন্য নিম্নলিখিত কোডটি /root/.bashrc এ যুক্ত করি,

এই স্ক্রিপ্টটি চালানোর আগে দয়া করে ধারকটিকে চিত্রটিতে প্রতিশ্রুতিবদ্ধ করুন, অন্যথায় চিত্রগুলিতে 'ডকার_সার্ভিসেস' ফাইল তৈরি হবে এবং কোনও পরিষেবা চালানো হবে না।

if [ ! -e /var/run/docker_services ]; then
    echo "Starting services"
    service mysql start
    service ssh start
    service nginx start
    touch /var/run/docker_services
fi

1

ডকের পাত্রে যখনই চালিত হয় আমি এখানে স্বয়ংক্রিয়ভাবে মাইএসকিউএল পরিষেবাটি শুরু করি start

আমার ক্ষেত্রে, আমার কেবল মাইএসকিউএল নয় পিএইচপি, এনগিনেক্স এবং মেমক্যাচ করা দরকার

ডকফাইফাইলে আমার নীচের লাইনগুলি রয়েছে

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
EXPOSE 3306
CMD service mysql start && service php-fpm start && nginx -g 'daemon off;' && service memcached start && bash

& ব্যাশ যুক্ত করার ফলে ধারকটির মধ্যে এনগিনেক্স, মাইএসকিউএল, পিএইচপি এবং মেমক্যাচ চলতে থাকবে।


1

এটি কাজ করে না CMD service mysql start && /bin/bash

এটি কাজ করে না CMD service mysql start ; /bin/bash ;

- আমি ধারণা করি ইন্টারেক্টিভ মোড অগ্রভাগের পক্ষে সমর্থন করবে না।

এইটা কাজ করে !! CMD service nginx start ; while true ; do sleep 100; done;

এইটা কাজ করে !! CMD service nginx start && tail -F /var/log/nginx/access.log

docker run -p 80:80 nginx_bashকমান্ড প্যারামিটার ছাড়াই আপনার ব্যবহার করা উচিত ।


0

ডকার ওয়েবসাইটের নিম্নলিখিত ডকুমেন্টেশনগুলি দেখায় যে কীভাবে ডকার পাত্রে একটি এসএসএইচ পরিষেবা প্রয়োগ করা যায়। আপনার পরিষেবার জন্য এটি সহজেই মানিয়ে নেওয়া উচিত:

এই প্রশ্নে একটি বৈকল্পিকতা এখানে জিজ্ঞাসা করা হয়েছে:


এসএসএইচ সার্ভার ইনস্টলেশন ব্যতীত কনটেইনারে প্রবেশের জন্য ন্যানসেটর সরঞ্জামটি হল আরেকটি পদ্ধতি: github.com/jpetazzo/nsenter । তবে এই পদ্ধতির জন্য আপনার ডকার হোস্টের অ্যাক্সেস প্রয়োজন (সাধারণত এসএসএইচ অ্যাক্সেস যথেষ্ট)।
ফাবিয়েন বালাগিয়াস

লিঙ্কটি ডকস.ডকার.সারি /#/example/running_ssh_service কাজ করে না। আপনি এটি আপডেট করতে পারেন?
অঙ্কুর

0
docker export -o <nameOfContainer>.tar <nameOfContainer>

ডকার প্রুন ব্যবহার করে বিদ্যমান পাত্রে ছাঁটাই করা দরকার ...

প্রয়োজনীয় পরিবর্তনগুলি সহ আমদানি করুন:

cat <nameOfContainer>.tar | docker import -c "ENTRYPOINT service mysql start && /bin/bash" - <nameOfContainer>

হোস্ট / ডেমন পুনর্ব্যবহারের পরে এটি স্বয়ংক্রিয়ভাবে পুনরায় শুরু হবে তা নিশ্চিত করতে কনটেইনারটি সর্বদা পুনঃসূচনা বিকল্প সহ চালান:

docker run -d -t -i --restart always --name <nameOfContainer> <nameOfContainer> /bin/bash

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

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