কোনও প্রসেস (স্ক্রিপ্ট) কোনও এলএক্সসি পাত্রে (ock ডকার রানটাইম) এর ভিতরে চলে কিনা তা নির্ধারণ করার কোনও উপায় আছে কি? আমি জানি যে কিছু প্রোগ্রামগুলি ভার্চুয়াল মেশিনের অভ্যন্তরে চলে কিনা তা সনাক্ত করতে সক্ষম, lxc / ডকারের জন্য কি অনুরূপ কিছু উপলব্ধ?
কোনও প্রসেস (স্ক্রিপ্ট) কোনও এলএক্সসি পাত্রে (ock ডকার রানটাইম) এর ভিতরে চলে কিনা তা নির্ধারণ করার কোনও উপায় আছে কি? আমি জানি যে কিছু প্রোগ্রামগুলি ভার্চুয়াল মেশিনের অভ্যন্তরে চলে কিনা তা সনাক্ত করতে সক্ষম, lxc / ডকারের জন্য কি অনুরূপ কিছু উপলব্ধ?
উত্তর:
সবচেয়ে নির্ভরযোগ্য উপায় চেক করা হয় /proc/1/cgroup
। এটি আপনাকে init প্রক্রিয়াটির নিয়ন্ত্রণ গোষ্ঠীগুলি বলবে এবং আপনি যখন কোনও ধারক নন , তখন এটি /
সমস্ত শ্রেণিবিন্যাসের জন্য হবে। আপনি যখন কোনও ধারকের ভিতরে থাকবেন, আপনি অ্যাঙ্কর পয়েন্টের নামটি দেখতে পাবেন। এলএক্সসি / ডকার পাত্র সহ এটি যথাক্রমে /lxc/<containerid>
বা /docker/<containerid>
যথাক্রমে কিছু হবে ।
docker
পরিবর্তে ব্যবহার lxc
করে
/
সমস্ত সিগ্রুপের জন্য 1 প্রক্রিয়াটিতে নির্ভর করতে পারবেন না ; আমার ডেবিয়ান 9 সিস্টেমে (232 systemd) শুধুমাত্র দশ Cgroups তিন ( 3:cpuset
, 4:perf_event
এবং 7:freezer
) মূলে আছে; বাকি অধীনে আছে /init.scope
। এটি বলেছিল, আমি মনে করি যে সেই ফাইলটির জন্য অনুসন্ধান :/docker/
করা সম্ভবত এই মুহুর্তে সবচেয়ে নির্ভরযোগ্য হিউরিস্টিক।
grep 'docker\|lxc' /proc/1/cgroup
আমার জন্য ডকার 18.09 এ কাজ করে।
ডকার .dockerenv
কনটেইনারটির ভিতরে ডিরেক্টরি গাছের গোড়ায় একটি ফাইল তৈরি করে । আপনি যাচাই করতে এই স্ক্রিপ্টটি চালাতে পারেন
#!/bin/bash
if [ -f /.dockerenv ]; then
echo "I'm inside matrix ;(";
else
echo "I'm living in real world!";
fi
আরও:
উবুন্টুতে আসলে একটি বাশ স্ক্রিপ্ট রয়েছে: /bin/running-in-container
এবং এটি আসলে যে ধরণের কন্টেইনারটি চালানো হয়েছিল তা এটি ফিরিয়ে দিতে পারে M সহায়ক হতে পারে। যদিও অন্য বড় ডিস্ট্রোস সম্পর্কে জানেন না।
.dockerinit
ফাইলটি সরানো হয়েছে , সুতরাং এই পদ্ধতিটি আর কাজ করবে না। এই লেখার হিসাবে, .dockerenv
ফাইলটি এখনও চারপাশে রাখা হয়েছে, যাতে সম্ভবত এটি পরিবর্তে ব্যবহার করা যেতে পারে।
/bin/running-in-container
দ্বারা সরবরাহ করা হয় upstart
। সিস্টেমেডে রূপান্তর হওয়ার সাথে সাথে এটি সরে যেতে পারে। আমি আশা করি না - এটি দরকারী মনে হচ্ছে!
একটি নতুন উবুন্টু 16.04 সিস্টেমে, নতুন সিস্টেমড ও এলএক্সসি 2.0
sudo grep -qa container=lxc /proc/1/environ
ডকারে চলছে কিনা তা পরীক্ষা করার জন্য হ্যান্ডি পাইথন ফাংশন:
def in_docker():
""" Returns: True if running in a Docker container, else False """
with open('/proc/1/cgroup', 'rt') as ifh:
return 'docker' in ifh.read()
kubepods
আমার অনুমান।
প্রক্রিয়াটির পিআইডি এক্সট্রাক্ট করার জন্য আমরা প্র্যাকের শিডিয়ুল (/ proc / $ পিআইডি / সময়সূচি) ব্যবহার করি। ধারকটির ভিতরে প্রক্রিয়াটির পিআইডি পৃথক হবে তারপরে এটি হোস্টের পিআইডি (একটি নন-ধারক সিস্টেম)।
উদাহরণস্বরূপ, একটি ধারকটিতে / proc / 1 / সময়সূচির আউটপুট ফিরে আসবে:
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
একটি ধারকহীন হোস্টে থাকার সময়:
$ cat /proc/1/sched | head -n 1
init (1, #threads: 1)
এটি আপনি ধারক হয়ে আছেন বা না থাকায় পার্থক্য করতে সহায়তা করে।
sh
এবং init
সেখানে থাকে না তবে এটি উভয় ক্ষেত্রেই প্রায় কিছু হতে পারে।
bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
সবচেয়ে সহজ উপায় হল পরিবেশ পরীক্ষা করা। আপনার যদি container=lxc
ভেরিয়েবল থাকে তবে আপনি একটি পাত্রে রয়েছেন।
অন্যথায়, আপনি যদি রুট হন তবে আপনি সঞ্চালন করতে mknod
বা mount
পরিচালনা করতে চেষ্টা করতে পারেন , যদি এটি ব্যর্থ হয় তবে আপনি সম্ভবত ঝুঁকির ক্ষমতা সম্পন্ন পাত্রে থাকবেন।
/proc/1/cgroup
আপনাকে এটি সনাক্ত করতে দেয় না।
docker run alpine env
ভেরিয়েবলের মতো দেখতে এমন কিছু দেয় না
আমার উত্তরটি কেবল নোড.জেএস প্রক্রিয়াগুলির জন্য প্রযোজ্য তবে কিছু দর্শনার্থীর ক্ষেত্রে এটি প্রাসঙ্গিক হতে পারে যারা কোনও নোড.জেএস নির্দিষ্ট উত্তর খুঁজছেন এই প্রশ্নের সাথে হোঁচট খায়।
আমার একই সমস্যা ছিল এবং /proc/self/cgroup
আমি একটি এনএমপি প্যাকেজ তৈরি করে তার উপর নির্ভর করি কেবল এই উদ্দেশ্যে - পাত্রে কোনও নোড.জেএস প্রক্রিয়া চালিত হয় কিনা তা সনাক্ত করতে।
Containerized npm মডিউল Node.js. মধ্যে আপনাকে সাহায্য করবে এটি বর্তমানে আইওজেজে পরীক্ষিত নয় তবে সেখানে খুব ভালভাবে কাজ করতে পারে।
পাইথনের উপরের সমস্ত সমাধানের জন্য পরীক্ষা করুন:
import os
def in_container():
proc_1 = r'/proc/1/sched'
if os.path.exists(proc_1):
with open(proc_1, 'r') as fp:
out = fp.read()
else:
out = ''
checks = [
'docker' in out,
'/lxc/' in out,
out.split(' ')[0] not in ('systemd', 'init',),
os.path.exists('./dockerenv'),
os.path.exists('/.dockerinit'),
os.getenv('container') is not None
]
return any(checks)
if __name__ == '__main__':
print(in_container())
ধারণার প্রমাণ:
$ docker run --rm -it --mount type=bind,source=${PWD}/incontainer.py,target=/tmp/script.py python:3 python /tmp/script.py
True
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
যেমন গৃহীত উত্তর প্রতি এখানে stackoverflow.com/questions/20010199/...
cat
! দুর্দান্ত এক :
ডকার দিন দিন বিকশিত হচ্ছে, তাই তারা .dockerenv .dockerinit
ভবিষ্যতে রাখবে কিনা তা আমরা নিশ্চিত করে বলতে পারি না ।
লিনাক্সের বেশিরভাগ স্বাদই init
প্রথম প্রক্রিয়া শুরু হয়। তবে পাত্রে ক্ষেত্রে এটি সত্য নয়।
#!/bin/bash
if ps -p1|grep -q init;then
echo "non-docker"
else
echo "docker"
fi
init
, যা নির্ভর systemd
বা launchd
ভিত্তিক সিস্টেমে সত্য নয় ...
init
যদিও তাদের পিআইডি 1 কল করতে পারে ), ওপেনআরসি, আরিগ, রানিট। এখানে দেখুন । বেশিরভাগ আধুনিক লিনাক্স-ভিত্তিক সিস্টেমগুলি ব্যবহার করবে systemd
, কিছু পুরানো, আপস্টার্ট .... সমস্ত আধুনিক ওএস এক্স সিস্টেম ব্যবহার করবেlaunchd
এই SO প্রশ্নোত্তর: "OS ভার্চুয়াল পরিবেশে চলমান কিনা" তা অনুসন্ধান করুন ; যদিও ওপি-র প্রশ্নের মতো নয়, আপনি কোন ধারক (যদি আদৌ) থাকেন তবে এটি সাধারণ ক্ষেত্রে সুনির্দিষ্টভাবে উত্তর দেয়।
বিশেষত, এই ব্যাশ স্ক্রিপ্টের কোডটি ইনস্টল করুন এবং পড়ুন যা মনে হয় বেশ ভালভাবে কাজ করছে:
গুণ-কি :
sudo apt install virt-what
virt-what
উবুন্টু 16.04 এ 1.14-1 সংস্করণ দিয়ে কাজ করে না । প্যাচ দরকার।
আমি জেজেসির উত্তরগুলি রুবিতে অনুবাদ করেছি
def in_docker
File.open('/proc/1/cgroup', 'rt') do |f|
contents = f.read
return contents =~ /docker/i || contents =~ /kubepod/i
end
rescue StandardError => e
p 'Local development'
p e
false
end
একটি ডকার পাত্রে, এন্ট্রি /proc/self/cgroup
হোস্টের সিগ্রুপে মাউন্ট করা হয়।
যেমন একটি পাত্রে
# awk -F: '/cpuset/' /proc/self/cgroup
3:cpuset:/docker/22bd0c154fb4e0d1b6c748faf1f1a12116acc21ce287618a115ad2bea41256b3
যদিও, হোস্ট একই
$ awk -F: '/cpuset/' /proc/self/cgroup
3:cpuset:/
লো প্রোফাইল পরীক্ষার জন্য শেলটিতে কিছু ব্যবহার করা
is_running_in_container() {
awk -F: '/cpuset/ && $3 ~ /^\/$/{ c=1 } END { exit c }' /proc/self/cgroup
}
if is_running_in_container; then
echo "Aye!! I'm in a container"
else
echo "Nay!! I'm not in a container"
fi
সম্ভবত এটি কৌশলটি করুন:
if [ -z $(docker ps -q) ]; then
echo "There is not process currently running"
else
echo "There are processes running"
fi
তুমি কি এটাই চাও? আশা করি এটি সাহায্য করে =)
docker
স্পষ্টতই ধারকটির অভ্যন্তর থেকে কোনও বাইনারি পাওয়া যায় না ।
docker
হোস্টের ডকার সকেটে অ্যাক্সেস করে।