ডকার কনটেইনার থেকে হোস্টে শেল স্ক্রিপ্ট কীভাবে চালানো যায়?


94

ডকার পাত্রে থেকে হোস্ট কীভাবে নিয়ন্ত্রণ করবেন?

উদাহরণস্বরূপ, বাশ স্ক্রিপ্ট হোস্টে অনুলিপি কার্যকর কিভাবে করবেন?


8
ডকার থেকে হোস্টকে বিচ্ছিন্ন করার বিপরীতটি কি হবে না?
মার্কাস মুলার

31
হ্যাঁ. তবে এটি কখনও কখনও প্রয়োজনীয় হয়।
অ্যালেক্স উশাকভ


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

@ কেসিডি এবং কেন তারা সিস্টেম-স্তরের পাত্রে (এলএক্সসি) ব্যবহার না করে ডকারের মাধ্যমে অ্যাপ-কন্টেইনারাইজেশন পছন্দ করে?
অ্যালেক্স উশাকভ

উত্তর:


28

এই সত্যিই নির্ভর করে আপনার যে বাশ স্ক্রিপ্টটি করার দরকার তা তার উপর নির্ভর করে!

উদাহরণস্বরূপ, যদি ব্যাশ স্ক্রিপ্টটি কিছু আউটপুট প্রতিধ্বনি করে তবে আপনি কেবল এটি করতে পারেন

docker run --rm -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh

আরেকটি সম্ভাবনা হ'ল আপনি বাশ স্ক্রিপ্টটি কিছু সফ্টওয়্যার ইনস্টল করতে চান - স্ক্রিপ্টটি ডকার-কম্পোজ ইনস্টল করতে বলে। আপনি যেমন কিছু করতে পারে

docker run --rm -v /usr/bin:/usr/bin --privileged -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh

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


4
হোস্টের সাথে সংযোগ স্থাপন করে এবং নতুন ধারক তৈরি করে এমন ধারক তৈরি করার আমার ধারণা ছিল।
অ্যালেক্স উশাকভ

4
ডকার আপনার আপেক্ষিক মাউন্ট পছন্দ করে না বলে মনে হচ্ছে। এটি কাজ করা উচিতdocker run --rm -v $(pwd)/mybashscript.sh:/work/mybashscript.sh ubuntu /work/mybashscript.sh
কেসিডি

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

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

4
এটি চেষ্টা করে, স্ক্রিপ্টটি
ধারকটিতে

60

আমি যে সমাধানটি ব্যবহার করি তা হ'ল হোস্টের সাথে সংযোগ স্থাপন করা SSHএবং কমান্ডটি এভাবে চালিত করা:

ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"

হালনাগাদ

যেহেতু এই উত্তরটি ভোট পেতে চলেছে, আমি মনে করিয়ে দিতে চাই (এবং উচ্চ প্রস্তাব দিয়েছি), যে অ্যাকাউন্টটি স্ক্রিপ্টের জন্য অনুরোধ করা হচ্ছে তা কোনও অনুমতি ছাড়াই একটি অ্যাকাউন্ট হওয়া উচিত, তবে কেবল সেই স্ক্রিপ্টটি চালানো sudo(যা হতে পারে) sudoersফাইল থেকে সম্পন্ন )।


অন্য কাজ হিসাবে, ধারক কমান্ডের একটি সেট আউটপুট তৈরি করতে পারে এবং ধারকটি প্রস্থান হওয়ার পরে হোস্ট তাদের চালাতে পারে: eval $ (ডকার চালান - rm -it ধারক_নাম_ টু আউটপুট স্ক্রিপ্ট)
parity3

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

@ রনরোজেনফিল্ড, আপনি কোন ডকার চিত্র ব্যবহার করছেন? ডেবিয়ান ক্ষেত্রে / Ubuntu, এই সঞ্চালন করুন: apt update && apt install openssh-client
মোহাম্মদ নুরাল্ডিন

এটি আমার সিএনোলজি এনএএস-এ ইনস্টল হওয়া যা কিছু হবে। আমি কীভাবে বলতে পারি?
রন রোজেনফিল্ড

@ রোনরোসনফিল্ড, দুঃখিত আপনি কী বলতে চাইছেন তা আমি বুঝতে পারি না
মোহাম্মদ নুরাল্ডিন

52

একটি নামক পাইপ ব্যবহার। হোস্ট ওএস-এ, কমান্ডগুলি লুপ এবং পড়ার জন্য একটি স্ক্রিপ্ট তৈরি করুন এবং তারপরে আপনি এটিকে ওভাল বলবেন।

ডকারের ধারকটিকে সেই নামক পাইপটি পড়তে দিন।

পাইপ অ্যাক্সেস করতে সক্ষম হতে, আপনাকে এটি একটি ভলিউমের মাধ্যমে মাউন্ট করতে হবে।

এটি এসএসএইচ মেকানিজমের অনুরূপ (বা অনুরূপ সকেট ভিত্তিক পদ্ধতি), তবে আপনাকে হোস্ট ডিভাইসে সঠিকভাবে সীমাবদ্ধ করে, এটি সম্ভবত আরও ভাল। এছাড়াও আপনাকে প্রমাণীকরণের তথ্যটি অতিক্রম করতে হবে না।

আমার একমাত্র সতর্কতা হ'ল আপনি কেন এটি করছেন তা সম্পর্কে সতর্কতা অবলম্বন করা। এটি সম্পূর্ণরূপে কিছু করতে হবে যদি আপনি ব্যবহারকারী ইনপুট বা যা কিছু সহ স্ব-আপগ্রেড করার একটি পদ্ধতি তৈরি করতে চান তবে আপনি সম্ভবত কিছু কনফিগার ডেটা পেতে একটি কমান্ড কল করতে চান না, কারণ সঠিক উপায়টি এটি আর্গ হিসাবে প্রবেশ করানো হবে / ভলিউম ডকারে। আপনি যে বিবর্তন করছেন সে সম্পর্কেও সতর্ক থাকুন, তাই কেবল অনুমতি মডেলটিকে একটি চিন্তাভাবনা করুন।

অন্যান্য উত্তরগুলির মধ্যে যেমন স্ক্রিপ্ট চালানো under একটি ভলিউম সাধারণভাবে কাজ করবে না কারণ তারা সম্পূর্ণ সিস্টেমের সংস্থানগুলিতে অ্যাক্সেস পাবে না, তবে এটি আপনার ব্যবহারের উপর নির্ভর করে আরও উপযুক্ত হতে পারে।


14
মনোযোগ: এটি সঠিক / সেরা উত্তর এবং এর আরও কিছু প্রশংসা দরকার। অন্য প্রতিটি উত্তর "আপনি যা করতে চাইছেন" জিজ্ঞাসা করে এবং স্টাফের জন্য ব্যতিক্রম তৈরি করে ম্লান। আমার একটি খুব নির্দিষ্ট ব্যবহারের কেস রয়েছে যা আমাকে এটি করতে সক্ষম হতে হবে, এবং এটিই হ'ল উত্তম উত্তর im উপরে এসএসএইচ সুরক্ষা / ফায়ারওয়াল মান হ্রাস প্রয়োজন, এবং ডকার রান স্টাফ ভুল ফ্ল্যাট বাইরে। এর জন্য ধন্যবাদ. আমি ধরে নিয়েছি এটি এতগুলি উত্স পাবে না কারণ এটি কোনও সাধারণ অনুলিপি / পেস্ট উত্তর নয়, তবে এটি উত্তর। আমি পারলে আমার কাছ থেকে 100 পয়েন্ট
ফারলে

4
আরও কিছু তথ্যের সন্ধানকারীদের জন্য , আপনি হোস্ট মেশিনে চলমান নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন: unix.stackexchange.com/a/369465 অবশ্যই, আপনি এটি 'nohup' দিয়ে চালাতে হবে এবং কোনও ধরণের সুপারভাইজার মোড়ক তৈরি করতে হবে এটি জীবিত রাখার জন্য (সম্ভবত ক্রোন জব ব্যবহার করুন: পি)
সেকোট্রনিক

7
এটি একটি ভাল উত্তর হতে পারে। তবে, আপনি আরও বিশদ এবং আরও কিছু কমান্ড লাইনের ব্যাখ্যা দিলে এটি আরও ভাল। বিস্তারিত বলা কি সম্ভব?
মোহাম্মদ নুরাল্ডিন

4
উত্সাহিত, এই কাজ! যেখানে ভলিউম মাউন্ট করা হয়েছে সেখানে 'mkfifo host_executor_queue' ব্যবহার করে একটি নামযুক্ত পাইপ তৈরি করুন। তারপরে এমন একটি ভোক্তা যুক্ত করতে যা হোস্টের শেল হিসাবে কাতারে রাখা কমান্ডগুলি কার্যকর করে, 'লেজ -f হোস্ট_এক্সিকিউটর_উইউ ব্যবহার করুন | sh & '। & এর শেষে এটি পটভূমিতে চালিত করে। পরিশেষে কমান্ডগুলিকে কাতারে ঠেলাতে 'ইকো টাচ ফু>> হোস্ট_এক্সিকিউটর_উইউ' ব্যবহার করুন - এই পরীক্ষাটি হোম ডিরেক্টরিতে একটি টেম্পল ফাইল তৈরি করে। আপনি যদি গ্রাহকটি সিস্টেমের শুরুতে শুরু করতে চান তবে '@ রিবুট লেজ -f হোস্ট_এক্সিকিউটর_কিউ রাখুন | sh & 'crontab এ। কেবল হোস্ট_এক্সেক্টর_উইয়েতে আপেক্ষিক পাথ যুক্ত করুন।
স্কাইবঙ্ক

4
কেউ উদাহরণ কোড সহ উত্তরটি সম্পাদনা করতে পারে?
লুকাস পটারস্কি

6

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

দয়া করে https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface দেখুন এবং দেখুন আপনার ব্যক্তিগত ঝুঁকি সহনশীলতা এই নির্দিষ্ট অ্যাপ্লিকেশনের জন্য এটি অনুমোদন করে কিনা।

আপনি আপনার স্টার্ট কমান্ডটিতে নিম্নলিখিত ভলিউম আরোগুলি যুক্ত করে এটি করতে পারেন

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

বা /var/run/docker.sock আপনার ডকার কম্পোজ ফাইলের মধ্যে এইভাবে ভাগ করে:

version: '3'

services:
   ci:
      command: ...
      image: ...
      volumes
         - /var/run/docker.sock:/var/run/docker.sock

আপনি যখন আপনার ডকারের ধারক মধ্যে ডকার শুরু কমান্ডটি চালাবেন, আপনার হোস্টে চলমান ডকার সার্ভারটি অনুরোধ এবং ভাইবোন ধারকটির বিধান দেখবে।

ক্রেডিট: http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/


4
বিবেচনা করুন যে ডকারটি অবশ্যই পাত্রে ইনস্টল করা উচিত, অন্যথায় আপনাকে ডকার বাইনারি (উদাঃ /usr/bin/docker:/usr/bin/docker) এর জন্য একটি ভলিউমও মাউন্ট করতে হবে ।
গেরি


@ ডাটগুয়েজ ধন্যবাদ, আমি আপনার সংস্থানটি আপনার সংস্থান দ্বারা বর্ণিত বিষয়গুলি প্রতিফলিত করতে সম্পাদনা করেছি।
ম্যাট বুচ্চি

এটি কোনও পাত্রে নয়, হোস্টে স্ক্রিপ্ট চালানোর বিষয়ে প্রশ্নের উত্তর দেয় না
ব্র্যান্ডন

5

এই উত্তরটি ব্র্যাডফোর্ড মেডিওরোসের সমাধানের আরও বিশদ সংস্করণ , যা আমার পক্ষেও সেরা উত্তর হিসাবে প্রমাণিত হয়েছিল, তাই কৃতিত্ব তাঁর কাছে।

তার উত্তরে তিনি কী করবেন তা ব্যাখ্যা করেছেন ( নামযুক্ত পাইপ ) তবে এটি ঠিক কীভাবে করবেন তা নয়।

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

পার্ট 1 - ডকার ছাড়াই নামযুক্ত পাইপ ধারণাটি পরীক্ষা করা

প্রধান হোস্টে, ফোল্ডারটি বেছে নিন যেখানে আপনি আপনার নামক পাইপ ফাইল রাখতে চান, উদাহরণস্বরূপ /path/to/pipe/এবং একটি পাইপের নাম, উদাহরণস্বরূপ mypipe, এবং তারপরে চালান:

mkfifo /path/to/pipe/mypipe

পাইপ তৈরি হয়। প্রকার

ls -l /path/to/pipe/mypipe 

এবং অ্যাক্সেসের অধিকারগুলি "পি" দিয়ে শুরু করে দেখুন, যেমন

prw-r--r-- 1 root root 0 mypipe

এখন চালান:

tail -f /path/to/pipe/mypipe

টার্মিনালটি এখন এই পাইপে ডেটা প্রেরণের জন্য অপেক্ষা করছে

এখন অন্য টার্মিনাল উইন্ডো খুলুন।

এবং তারপরে চালান:

echo "hello world" > /path/to/pipe/mypipe

প্রথম টার্মিনালটি পরীক্ষা করুন (যার সাথে tail -fএটি রয়েছে) এটি "হ্যালো ওয়ার্ল্ড" প্রদর্শিত হবে

পার্ট 2 - পাইপের মাধ্যমে কমান্ডগুলি চালান

হোস্ট কনটেইনারটিতে, চালনার পরিবর্তে tail -fযা ইনপুট হিসাবে যা কিছু প্রেরিত হয় তা কেবল আউটপুট করে দেয়, এই কমান্ডটি চালান যা এটি কমান্ড হিসাবে কার্যকর করবে:

eval "$(cat /path/to/pipe/mypipe)"

তারপরে, অন্য টার্মিনাল থেকে, চালানোর চেষ্টা করুন:

echo "ls -l" > /path/to/pipe/mypipe

প্রথম টার্মিনালে ফিরে যান এবং আপনার ls -lকমান্ডের ফলাফলটি দেখতে হবে ।

পার্ট 3 - চিরকালের জন্য এটি শুনতে দিন

আপনি লক্ষ করেছেন যে পূর্ববর্তী অংশে, ls -lআউটপুট প্রদর্শিত হওয়ার ঠিক পরে , এটি কমান্ডগুলি শোনা বন্ধ করে দেয়।

পরিবর্তে eval "$(cat /path/to/pipe/mypipe)", চালান:

while true; do eval "$(cat /path/to/pipe/mypipe)"; done

(আপনি এটি কিছু করতে পারেন)

এখন আপনি একের পর এক সীমাহীন সংখ্যক কমান্ড প্রেরণ করতে পারেন, সেগুলি কেবল প্রথমটি নয়, কার্যকর করা হবে।

পার্ট 4 - রিবুট হওয়ার পরেও এটিকে কাজ করুন

একমাত্র সতর্কতা হ'ল হোস্টটিকে পুনরায় বুট করতে হবে, "যখন" লুপটি কাজ করা বন্ধ করবে।

পুনরায় বুট পরিচালনা করতে, আমি এখানে যা করেছি:

হেডারের সাথে while true; do eval "$(cat /path/to/pipe/mypipe)"; doneডাকা একটি ফাইল রাখুনexecpipe.sh#!/bin/bash

chmod +xএটি ভুলবেন না

এটি চালিয়ে ক্রন্টব এ যুক্ত করুন

crontab -e

এবং তারপরে অ্যাড

@reboot /path/to/execpipe.sh

এই মুহুর্তে, এটি পরীক্ষা করুন: আপনার সার্ভারটি পুনরায় বুট করুন, এবং এটি ফিরে আসার পরে পাইপের মধ্যে কিছু কমান্ড প্রতিধ্বনি করুন এবং সেগুলি কার্যকর করা হয়েছে কিনা তা পরীক্ষা করুন। অবশ্যই, আপনি কমান্ডগুলির আউটপুট দেখতে সক্ষম নন, সুতরাং ls -lসাহায্য করবে না, তবে touch somefileসহায়তা করবে।

অন্য বিকল্পটি কোনও ফাইলে আউটপুট রাখার জন্য স্ক্রিপ্টটি পরিবর্তন করা যেমন:

while true; do eval "$(cat /path/to/pipe/mypipe)" &> /somepath/output.txt; done

এখন আপনি চালাতে পারেন ls -lএবং আউটপুট ( &>স্ট্যাডআউট এবং স্ট্যাডার উভয় ব্যাশ ব্যবহার করে ) আউটপুট.টিএসএক্সে থাকতে হবে।

পার্ট 5 - এটি ডকার দিয়ে কাজ করুন

আপনি যদি আমার মতো ডকার কম্পোজ এবং ডকফাইল উভয়ই ব্যবহার করেন তবে আমি যা করেছি তা এখানে:

আসুন ধরে নেওয়া যাক /hostpipeআপনি নিজের ধারক হিসাবে মাইপাইপের পিতা-মাতা ফোল্ডারটি মাউন্ট করতে চান

এটি যুক্ত করুন:

VOLUME /hostpipe

একটি মাউন্ট পয়েন্ট তৈরি করতে আপনার ডকফায়াইল এ

তারপরে এটি যুক্ত করুন:

volumes:
   - /path/to/pipe:/hostpipe

হোস্টপাইপ হিসাবে / পাথ / টু / পাইপ হিসাবে মাউন্ট করার জন্য আপনার ডকার রচনা ফাইলটিতে

আপনার ডকারের পাত্রে পুনরায় চালু করুন।

অংশ 6 - পরীক্ষা

আপনার ডকার পাত্রে কার্যকর করুন:

docker exec -it <container> bash

মাউন্ট ফোল্ডারে যান এবং আপনি পাইপটি দেখতে পারেন তা পরীক্ষা করুন:

cd /hostpipe && ls -l

এখন ধারক থেকে একটি কমান্ড চালানোর চেষ্টা করুন:

echo "touch this_file_was_created_on_main_host_from_a_container.txt" > /hostpipe/mypipe

এবং এটি কাজ করা উচিত!

সতর্কতা: আপনার যদি একটি ওএসএক্স (ম্যাক ওএস) হোস্ট এবং একটি লিনাক্স ধারক থাকে তবে এটি কাজ করবে না (এখানে ব্যাখ্যা https://stackoverflow.com/a/43474708/10018801 এবং এখানে https://github.com/docker ইস্যু করুন / ফর-ম্যাক / ইস্যু / 483 ) কারণ পাইপের প্রয়োগ একই রকম নয়, সুতরাং আপনি লিনাক্স থেকে পাইপে যা লিখবেন তা কেবল একটি লিনাক্স দ্বারা পড়তে পারে এবং ম্যাক ওএস থেকে পাইপটিতে আপনি যা লেখেন তা কেবল একটি দ্বারা পড়তে পারে ম্যাক ওএস (এই বাক্যটি খুব সঠিক নাও হতে পারে তবে কেবল একটি ক্রস-প্ল্যাটফর্মের সমস্যা উপস্থিত রয়েছে সে সম্পর্কে সচেতন থাকুন)।

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

পার্ট 7 - নোড.জেএস কনটেইনার থেকে উদাহরণ

এখানে আমি আমার নোড জেএস কনটেইনার থেকে মূল হোস্টে একটি আদেশ পাঠিয়ে আউটপুটটি পুনরুদ্ধার করব:

const pipePath = "/hostpipe/mypipe"
const outputPath = "/hostpipe/output.txt"
const commandToRun = "pwd && ls-l"

console.log("delete previous output")
if (fs.existsSync(outputPath)) fs.unlinkSync(outputPath)

console.log("writing to pipe...")
const wstream = fs.createWriteStream(pipePath)
wstream.write(commandToRun)
wstream.close()

console.log("waiting for output.txt...") //there are better ways to do that than setInterval
let timeout = 10000 //stop waiting after 10 seconds (something might be wrong)
const timeoutStart = Date.now()
const myLoop = setInterval(function () {
    if (Date.now() - timeoutStart > timeout) {
        clearInterval(myLoop);
        console.log("timed out")
    } else {
        //if output.txt exists, read it
        if (fs.existsSync(outputPath)) {
            clearInterval(myLoop);
            const data = fs.readFileSync(outputPath).toString()
            if (fs.existsSync(outputPath)) fs.unlinkSync(outputPath) //delete the output file
            console.log(data) //log the output of the command
        }
    }
}, 300);

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

4

কোনও পোর্টে শোনার জন্য একটি সাধারণ সার্ভার অজগর সার্ভার লিখুন (বলুন 8080), ধারকটির সাথে পোর্ট -p 8080: 8080 বেঁধে রাখুন, লোকালহোস্টের কাছে একটি HTTP অনুরোধ করুন: 8080 পোপেন সহ অজগর সার্ভারটি শেল স্ক্রিপ্ট চালাতে জিজ্ঞাসা করুন, কার্ল চালান বা এইচটিটিপি অনুরোধটি কার্ল -d করতে 'f "foo": "বার"}' লোকালহোস্ট: 8080

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess
import json

PORT_NUMBER = 8080

# This class will handles any incoming request from
# the browser 
class myHandler(BaseHTTPRequestHandler):
        def do_POST(self):
                content_len = int(self.headers.getheader('content-length'))
                post_body = self.rfile.read(content_len)
                self.send_response(200)
                self.end_headers()
                data = json.loads(post_body)

                # Use the post data
                cmd = "your shell cmd"
                p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
                p_status = p.wait()
                (output, err) = p.communicate()
                print "Command output : ", output
                print "Command exit status/return code : ", p_status

                self.wfile.write(cmd + "\n")
                return
try:
        # Create a web server and define the handler to manage the
        # incoming request
        server = HTTPServer(('', PORT_NUMBER), myHandler)
        print 'Started httpserver on port ' , PORT_NUMBER

        # Wait forever for incoming http requests
        server.serve_forever()

except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        server.socket.close()

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

2

আমার অলসতা আমাকে সবচেয়ে সহজ সমাধান খুঁজতে পরিচালিত করেছিল যা এখানে উত্তর হিসাবে প্রকাশিত হয়নি।

এটা তোলে উপর ভিত্তি করে তৈরি মহান নিবন্ধ দ্বারা Luc juggery

আপনার ডকারের ধারক থেকে আপনার লিনাক্স হোস্টের পুরো শেলটি অর্জন করার জন্য আপনাকে যা করতে হবে তা হ'ল:

docker run --privileged --pid=host -it alpine:3.8 \
nsenter -t 1 -m -u -n -i sh

ব্যাখ্যা:

--privileged: ধারকটিকে অতিরিক্ত অনুমতি দেয়, এটি ধারকটিকে হোস্টের ডিভাইসগুলিতে অ্যাক্সেস পেতে দেয় (/ dev)

--pid = হোস্ট: কনটেইনারগুলি ডকার হোস্টের প্রসেস ট্রি ব্যবহার করতে অনুমতি দেয় (যে ভিএমটিতে ডকার ডিমন চলছে) ন্যান্সটার ইউটিলিটি: বিদ্যমান নামস্থানগুলিতে একটি প্রক্রিয়া চালানোর অনুমতি দেয় (বিল্ডিং ব্লকগুলি যা পাত্রে বিচ্ছিন্নতা সরবরাহ করে)

এনসেন্টার (-t 1 -m -u -n -i sh) পিআইডি 1 সহ প্রসেসের মতো একই বিচ্ছিন্ন প্রেক্ষাপটে প্রসেসটি চালানোর অনুমতি দেয় পুরো কমান্ডটি তারপরে ভিএম-তে একটি ইন্টারেক্টিভ sh শেল সরবরাহ করবে

এই সেটআপটিতে প্রধান সুরক্ষা জড়িত রয়েছে এবং সতর্কতার সাথে ব্যবহার করা উচিত (যদি থাকে)।


1
docker run --detach-keys="ctrl-p" -it -v /:/mnt/rootdir --name testing busybox
# chroot /mnt/rootdir
# 

4
যদিও এই উত্তরটি ওপি-র প্রশ্নের সমাধান করতে পারে, আপনাকে পরামর্শ দেওয়া হয় যে এটি কীভাবে কাজ করে এবং কেন এটি সমস্যার সমাধান করে। এটি নতুন বিকাশকারীদের কী চলছে এবং কীভাবে এটি এবং এই জাতীয় সমস্যাগুলি নিজেরাই ঠিক করতে হয় তা বুঝতে সহায়তা করে। অবদানের জন্য ধন্যবাদ!
কালেব ক্লেভেটার

1

আমি একটি সহজ পদ্ধিতি আছে।

পদক্ষেপ 1: মাউন্ট /var/run/docker.sock:/var/run/docker.sock (সুতরাং আপনি আপনার ধারক মধ্যে ডকার কমান্ড কার্যকর করতে সক্ষম হবে)

পদক্ষেপ 2: আপনার ধারকটির নীচে এটি চালিত করুন। এখানে মূল অংশটি হ'ল (- নেটওয়ার্ক হোস্ট এটি হোস্ট প্রসঙ্গ থেকে কার্যকর হবে)

ডকার রান - আই --আরএম - নেট ওয়ার্ক -v /opt/test.sh:/test.sh আলপাইন: ৩.7 শট / টেস্ট.শ

test.sh- এ আপনার যা কিছু কমান্ড থাকতে হবে (ifconfig, netstat ইত্যাদি ...)। এখন আপনি হোস্ট কনটেক্সট আউটপুট পেতে সক্ষম হবেন।


4
হোস্ট নেটওয়ার্ক ব্যবহার করে নেটওয়ার্কিং সম্পর্কিত ডকার অফিসিয়াল ডকুমেন্টেশন অনুসারে, "তবে স্টোরেজ, প্রসেস নেমস্পেস এবং ইউজার নেমস্পেসের মতো অন্য সমস্ত উপায়ে প্রক্রিয়াটি হোস্ট থেকে আলাদা করা হয়।" চেক আউট করুন - ডকস.ডোকার.com
পিটার মুতিশ্য

0

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

https://docs.docker.com/references/commandline/cp/

কোনও ফাইল অনুলিপি করা হয়ে গেলে আপনি এটি স্থানীয়ভাবে চালাতে পারেন


4
আমি এটা জানি. এই স্ক্রিপ্টটি কীভাবে ডকারের ধারক থেকে অন্য কথায় চালানো যায়?
অ্যালেক্স উশাকোভ


4
@ অ্যালেক্স উশকভ: উপায় নেই। এটি করা ডকারের অনেক সুবিধা ভঙ্গ করবে। এটা করবেন না। এটি চেষ্টা করবেন না। আপনার কী করা দরকার তা পুনর্বিবেচনা করুন।
মার্কাস মুলার

আরও দেখুন Vlad এর কৌতুক forums.docker.com/t/...
user2915097

4
আপনি সর্বদা, হোস্টে, আপনার ধারকটিতে কিছু ভেরিয়েবলের মান পেতে পারেন, myvalue=$(docker run -it ubuntu echo $PATH)এটির মতো একটি স্ক্রিপ্ট শেলের মধ্যে এটির মতো নিয়মিত কিছু পরীক্ষা করুন (অবশ্যই, আপনি $ PATH ব্যতীত অন্য কিছু ব্যবহার করবেন, এটি কেবল একটি উদাহরণ মাত্র), যখন এটি কিছু নির্দিষ্ট মান, আপনি আপনার স্ক্রিপ্টটি চালু করুন
user2915097

0

আপনি পাইপ ধারণাটি ব্যবহার করতে পারেন, তবে হোকার মেশিনে একটি ডক পাত্রে থেকে কোনও স্ক্রিপ্ট কার্যকর করতে লক্ষ্য অর্জনের জন্য হোস্ট এবং fswatch এ একটি ফাইল ব্যবহার করুন । পছন্দ করুন (নিজের ঝুঁকিতে ব্যবহার করুন):

#! /bin/bash

touch .command_pipe
chmod +x .command_pipe

# Use fswatch to execute a command on the host machine and log result
fswatch -o --event Updated .command_pipe | \
            xargs -n1 -I "{}"  .command_pipe >> .command_pipe_log  &

 docker run -it --rm  \
   --name alpine  \
   -w /home/test \
   -v $PWD/.command_pipe:/dev/command_pipe \
   alpine:3.7 sh

rm -rf .command_pipe
kill %1

এই উদাহরণে, ধারকটির অভ্যন্তরে / dev / কমান্ড_পাইপে আদেশগুলি প্রেরণ করুন:

/home/test # echo 'docker network create test2.network.com' > /dev/command_pipe

হোস্টে, আপনি নেটওয়ার্কটি তৈরি করা হয়েছে কিনা তা পরীক্ষা করতে পারেন:

$ docker network ls | grep test2
8e029ec83afe        test2.network.com                            bridge              local

-7

ব্যবহারকারী 2915097 এর প্রতিক্রিয়া প্রসারিত করতে :

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

হ্যাঁ. তবে এটি কখনও কখনও প্রয়োজনীয় হয়।

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


আমার ব্যবহারের কেস রয়েছে: আমার ডকারাইজড সার্ভিস আছে A( গিথাবের এসআরসি )। ইন Aরেপো আমি সঠিক আঙ্গুলসমূহ যা 'Git টান' কম্যান্ড পর নতুন Docker ইমেজ তৈরি করে এবং এগুলো চালানোর (এবং অবশ্যই পুরাতন ধারক সরাতে) তৈরি করুন। পরবর্তী: গিথুবের ওয়েব-হুক রয়েছে যা মাস্টারকে ধাক্কা দেওয়ার পরে স্বেচ্ছাসেবী সমাপ্তির লিঙ্কে পোষ্ট অনুরোধ তৈরি করতে দেয়। সুতরাং আমি ডকেরাইজড পরিষেবা বি তৈরি করতে চাই না যা সেই শেষ পয়েন্ট হবে এবং এটি কেবলমাত্র HOST মেশিনে রেপো এ 'গিট পুল' চালাবে (গুরুত্বপূর্ণ: কমান্ড 'গিট টান' অবশ্যই হোস্ট পরিবেশে কার্যকর করা উচিত - বি পরিবেশে নয় কারণ বি বি এর ভিতরে নতুন ধারক চালাতে পারে না ...)
কামিল কিয়েসজেউস্কি

4
সমস্যা: লিনাক্স, গিট এবং ডকার ব্যতীত আমি HOST- তে আর কিছুই পেতে চাই না। এবং আমি ডকারিজেট সার্ভিস এ এবং পরিষেবা বি পেতে চাই (যা আসলে গিট-পুশ হ্যান্ডলার যা কেউ রেপো এ-তে গিট টান চালায় পরে কেউ মাস্টারকে গিট ঠেকানোর পরে)। সুতরাং গিট অটো-মোতায়েন করা সমস্যাযুক্ত ব্যবহারের ক্ষেত্রে
কামিল কিয়েসজেউস্কি

@ কামিলকিএকজেউউসকি আমি ঠিক একইভাবে চেষ্টা করার চেষ্টা করছি, আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
ব্যবহারকারীর 871784

4
"না, এটি কেস নয়" বলাটি সংকীর্ণ মনের এবং ধারণা করা হয় যে আপনি বিশ্বের প্রতিটি ব্যবহারের ক্ষেত্রে জানেন। আমাদের ব্যবহারের ক্ষেত্রে পরীক্ষা চলছে। পরিবেশকে সঠিকভাবে পরীক্ষা করার জন্য তাদের পাত্রে চালানো দরকার, তবে পরীক্ষার প্রকৃতি বিবেচনা করে তাদের হোস্টের স্ক্রিপ্টগুলি চালানো দরকার।
সেনিকা গঞ্জালেজ

4
কেবল তাদের কেন আমি একটি -7 উত্তর রেখে দিচ্ছি তা নিয়ে ভাবছেন: ক) এগুলি ফলস্বরূপ হওয়া ঠিক। আমি ভৃল ছিলাম. এটি এখানে নথিবদ্ধ যে ঠিক আছে। খ) মন্তব্যগুলি আসলে মূল্য অবদান করে; উত্তর মুছলে তা মুছে ফেলা হবে। গ) এটি এখনও এমন একটি দৃষ্টিভঙ্গির অবদান রাখে যা বিবেচনা করা বুদ্ধিমান হতে পারে (আপনার যদি না প্রয়োজন তবে নিজের বিচ্ছিন্নতা ভাঙবেন না Sometimes কখনও কখনও আপনাকে করতে হবে)।
মারকাস মুলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.