শেল স্ক্রিপ্ট ব্যবহার করে ডকারের ধারকের ভিতরে স্ক্রিপ্ট চালানো


88

আমি ডকার ধারক স্থাপনের জন্য একটি শেল স্ক্রিপ্ট তৈরি করার চেষ্টা করছি। আমার স্ক্রিপ্ট ফাইলটি দেখে মনে হচ্ছে:

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

এই স্ক্রিপ্ট ফাইলটি চালানো নতুন সঞ্চারিত ব্যাশে ধারকটি চালাবে।

এখন আমার উপরে একটি স্ক্রিপ্ট ফাইল চালানো দরকার (টেস্ট.শ) যা উপরের প্রদত্ত শেল স্ক্রিপ্ট থেকে ইতিমধ্যে ধারকটির ভিতরে রয়েছে (


4
কেন ব্যবহার করবেন না WORKDIRএবং CMD?
ধর্মিত

4
আপনি সম্ভবত এখানে --privileged ব্যবহার করতে চান না। দেখুন: স্ট্যাকওভারফ্লো.com
সিএমপি

উত্তর:


123

আপনি এটি ব্যবহার করে একটি চলমান ধারকটিতে একটি কমান্ড চালাতে পারেন docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:

docker exec mycontainer /path/to/test.sh

এবং বাশ সেশন থেকে চালানো:

docker exec -it mycontainer /bin/bash

সেখান থেকে আপনি আপনার স্ক্রিপ্ট চালাতে পারেন।


6
আমার যদি প্রথমে / বিন / ব্যাশে প্রবেশ করতে হবে এবং তারপরে সেই বাশের ভিতরে কমান্ড চালাতে হবে?
জ্যাপি

49
আপনি হোস্ট থেকে সরাসরি স্থানীয় স্ক্রিপ্টও চালাতে পারেন docker exec -i mycontainer bash < mylocal.sh এটি স্থানীয় হোস্ট স্ক্রিপ্টটি পড়ে এবং ধারকটির ভিতরে এটি চালায়। আপনি এটি অন্যান্য জিনিসগুলির সাথে করতে পারেন (যেমন .tgz ফাইলগুলিতে ট্যাপযুক্ত পাইপ দেওয়া হয়) - এটি কেবল ধারক প্রক্রিয়ায় স্ট্যান্ড ইনপুটটিতে পাইপ দেওয়ার জন্য '-i' ব্যবহার করে।
মার্ভিন 15

@ মারভিন যে পাওয়ারশেলের সমতুল্য? "<" অক্ষরটি স্বীকৃত নয়।
নিসিকিভি

4
আমি একটি PowerShell গুরু (সৌভাগ্যক্রমে) নই কিন্তু আমি তাই কাছাকাছি ওয়ান্ডারড দেখলেন stackoverflow.com/a/11788475/500902 । সুতরাং, হতে পারে Get-Content mylocal.sh | docker exec -i mycontainer bash। আমি জানি না যে এটি কাজ করে কিনা।
মার্ভিন

99

ধরে নেওয়া যায় যে আপনার ডকারের ধারকটি প্রস্তুত এবং চলমান রয়েছে, আপনি কমান্ডগুলি চালাতে পারেন:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"

4
আমি এই উত্তরটি পছন্দ করি; কমান্ড বা কমান্ডের সেট চালানোর জন্য আপনাকে ডকার পাত্রে লগ ইন করতে হবে না। ধন্যবাদ!
হাতেম জাবের

আপনি কীভাবে কীভাবে এটি আরও একধাপ এগিয়ে নিয়ে যেতে এবং /bin/sh -c "cmd1; cmd2; ...; cmdn"শেল ভেরিয়েবলের মান হিসাবে সম্পূর্ণ কমান্ড ( ) পাস করবেন তা জানেন ? আমি জিজ্ঞাসা করেছি কারণ 'ডকার রান' কোট করা স্ট্রিংয়ের পরিবর্তে একক কমান্ড এবং স্বতন্ত্র অব্যর্থ আর্গুমেন্টের প্রত্যাশা বলে মনে হচ্ছে।
ডেভিডা

@ মেসোস্কাক: এই উত্তরটি আপনাকে জানায় যে কীভাবে ইতিমধ্যে তৈরি হওয়া এবং চলমান ধারকটিতে লগইন না করে একাধিক কমান্ড চালানো যায় যা অটোমেশনে সহায়ক। তবে আপনি যদি ধারক তৈরির সময় একাধিক কমান্ড চালাতে চান (পিএস: ডকার রান কমান্ডটি ধারক তৈরি করে এবং শুরু করে), আপনি একই থ্রেডের উত্তরগুলি অনুসরণ করে এটি অর্জন করতে পারবেন stackoverflow.com/a/41363989/777617
সাইক্লোপস

পরিবর্তে cmd1, আমি জন্য-লুপ একটি সম্পূর্ণ মধ্যে পাস করতে হবে - কিন্তু এটা আশা ;পর লুপ বিবৃতি এবং কি বিবৃতি। আমি কীভাবে একটি একক কমান্ড হিসাবে পুরো ফর লুপটি চালাতে পারি cmd1? এটা কি সম্ভব?
নিকোলাস কে

19

আমি এই একই প্রশ্নের উত্তর খুঁজছিলাম এবং আমার জন্য ডকফায়াইল সমাধানে ENTRYPOINT খুঁজে পেয়েছি

ডকফেরফাইল

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

আমি যখন ধারকটি শুরু করি তখন স্ক্রিপ্টগুলি কার্যকর করা হয় এবং স্ক্রিপ্টগুলি কার্যকর হওয়ার পরে আমি বাশ প্রম্পট পাই।


6

আপনি নিজের ডকার ইমেজে একটি স্থানীয় ডিরেক্টরি মাউন্ট করতে পারেন এবং আপনার স্ক্রিপ্টটির উত্স তৈরি করতে পারেন .bashrc। আপনি প্রতিটি নতুন শেলের উপর চালিত না করতে চাইলে স্ক্রিপ্টটিতে ফাংশন থাকতে হবে তা ভুলে যাবেন না। (আপডেটের বিজ্ঞপ্তিটি দেখুন এটি পুরানো))

আমি ডকারের উদাহরণগুলির বাইরে স্ক্রিপ্টটি আপডেট করতে সক্ষম হতে এই সমাধানটি ব্যবহার করছি। এই পরিবর্তনগুলি ঘটে থাকলে আমাকে পুনরায় চালিত করতে হবে না, আমি কেবল একটি নতুন শেল খুলি। (শেলটি পুনরায় খোলার হাত থেকে মুক্তি পেয়েছে - আপডেট বিজ্ঞপ্তি দেখুন)

আপনি কীভাবে আপনার বর্তমান ডিরেক্টরিটিকে বেঁধে রাখছেন তা এখানে:

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

এখন আপনার বর্তমান ডিরেক্টরিটি /scriptsআপনার ডকার উদাহরণের সাথে আবদ্ধ ।

(পুরানো) আপনার .bashrcপরিবর্তনগুলি সংরক্ষণ করতে এই আদেশটি দিয়ে আপনার কার্যকরী চিত্র প্রতিশ্রুতিবদ্ধ:

docker commit $container_id $my_docker_build

হালনাগাদ

প্রতিটি পরিবর্তনের জন্য একটি নতুন শেল খোলার জন্য সমস্যাটি সমাধান করার জন্য আমি এখন নিম্নলিখিতটি করছি:

ডকফায়লে নিজেই আমি যুক্ত করি RUN echo "/scripts/bashrc" > /root/.bashrc"। ভিতরে zshrcআমি স্ক্রিপ্ট ডিরেক্টরি এক্সপোর্ট করি। স্ক্রিপ্ট ডিরেক্টরিতে এখন একের পরিবর্তে একাধিক ফাইল রয়েছে। এখন আমি প্রতিটি পরিবর্তনে সাব শেলটি না খালি সরাসরি সমস্ত স্ক্রিপ্টগুলিতে কল করতে পারি।

বিটিডাব্লু আপনি নিজের ধারকটির বাইরেও ইতিহাসের ফাইলটি সংজ্ঞায়িত করতে পারেন। এইভাবে আর কোনও ব্যাশ পরিবর্তনে প্রতিশ্রুতিবদ্ধ হওয়া দরকার নেই।


অনেক দেরী ..! @ জাভিয়ার ইতিমধ্যে একটি সরাসরি সমাধান সমাধান দেখায় !! আমি অনুভব করি যে এটি এখনও আরও ভাল।
জিপ্পি

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

3

আপনি যদি চলমান ধারক না চান (বা থাকতে চান), আপনি সরাসরি runকমান্ড দিয়ে আপনার স্ক্রিপ্টটি কল করতে পারেন ।

পুনরাবৃত্তি tty -i -tযুক্তিগুলি সরান এবং এটি ব্যবহার করুন:

    $ docker run ubuntu:bionic /bin/bash /path/to/script.sh

এটি (পরীক্ষিত হয়নি) অন্যান্য স্ক্রিপ্টগুলির জন্যও কাজ করবে:

    $ docker run ubuntu:bionic /usr/bin/python /path/to/script.py


0

আপনি যদি একাধিক উদাহরণে একই কমান্ডটি চালাতে চান তবে আপনি এটি করতে পারেন:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.