ডি-বাস সংযোগ পেতে ব্যর্থ: অপারেশন অনুমোদিত নয়


29

আমি ডকারে ব্যবহার করে আমার সেন্টোস চিত্রটিতে পরিষেবাগুলি তালিকাভুক্ত করার চেষ্টা করছি

systemctl list-units  

তবে আমি এই ত্রুটি বার্তাটি পেয়েছি:

Failed to get D-Bus connection: Operation not permitted

কোন পরামর্শ কি সমস্যা হতে পারে?


1
আপনি ব্যবহার করেন নি sudo?
মাইকেল হ্যাম্পটন

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

আপনার যদি systemdFROM centos/systemd
সেন্টোসের

উত্তর:


24

আমার অনুমান যে আপনি একটি non-privilegedধারক চালাচ্ছেন । সিস্টেমেডে CAP_SYS_ADMIN সামর্থ্য প্রয়োজন তবে ডকর আরও সুরক্ষিততা যুক্ত করার জন্য অযোগ্য সুবিধাযুক্ত ধারকগুলিতে সেই ক্ষমতাটি ফেলে দেয়।

systemd এর জন্য একটি ধারক মধ্যে সিগ্রুপ ফাইল সিস্টেমে আরও অ্যাক্সেস প্রয়োজন। আপনি এটি যুক্ত করতে পারেন–v /sys/fs/cgroup:/sys/fs/cgroup:ro

সুতরাং, ডকারের ধারকের অভ্যন্তরে সিস্টেমেড সহ সেন্টোস কীভাবে চালানো যায় সে সম্পর্কে কয়েকটি পদক্ষেপ এখানে:

  1. Centos চিত্রটি টানুন
  2. নীচের মত একটি ডকার ফাইল সেট আপ করুন:
FROM centos
MAINTAINER "Yourname" <youremail@address.com>
ENV container docker
RUN yum -y update; yum clean all
RUN yum -y install systemd; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
  1. এটি তৈরি করুন - docker build --rm -t centos7-systemd - < mydockerfile
  2. সঙ্গে একটি ধারক চালান docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init

  3. আপনার পাত্রে সিস্টেম হওয়া উচিত


বেশ ঝরঝরে! তবে কমপক্ষে আমি এখনই আরও তথ্য পাচ্ছি getting আমি যা লগ করছি তা এখানে:[ INFO ] Update UTMP about System Boot/Shutdown is not active. [DEPEND] Dependency failed for Update UTMP about System Runlevel Changes. Job systemd-update-utmp-runlevel.service/start failed with result 'dependency'. [ OK ] Started Journal Service. [ OK ] Reached target System Initialization. [ OK ] Reached target Timers. [ OK ] Listening on D-Bus System Message Bus Socket.
স্নো ক্র্যাশ

1
যদি আমি পরিষ্কার ছিল না! আমি এখনও ত্রুটি Failed to get D-Bus connection: Operation not permitted
পাচ্ছি

আপনি আমার উত্তর অনুলিপি করা ডকফেরাইল থেকে আপনার নিজের ইমেজ তৈরি করেছেন, আপনি সেই চিত্র থেকে একটি ধারক চালান, এবং আপনি এখনও একটি ত্রুটি পেয়েছেন?
13 ডিমিতর

4
বিঙ্গো! আমি /bin/bashশেলটি পেতে কন্টেইনারটি চালাচ্ছিলাম । তবে এটি আমাকে পূর্বের উল্লিখিত ত্রুটি দিয়েছে। আমি যখন এটির /usr/sbin/initপরামর্শ দিয়েছিলাম তখন শেলের সাথে সংযুক্ত হয়ে সমস্ত ভাল হয়ে গেছে। স্পষ্টতই আমি সম্পর্কে একটি উপকার মিস করছি /usr/sbin/init। এই উত্তরটি কিছুটা যথেষ্ট অগ্রগতির দাবিদার।
স্নো ক্র্যাশ

আমি এটি 2 দিন ধরে ছিলাম এবং এখনও কী /sys/fs/cgroup:/sys/fs/cgroupতা বা কোথা থেকে আসছে তা আমি এখনও বুঝতে পারি না ... আমি জানি কীভাবে অতিথি ফোল্ডারটিকে হিস্টে মাউন্ট করতে হবে: /src/:/var/wwwতবে আপনার ফাইলটি কোথা থেকে আসছে? এটি আমার প্রচুর ত্রুটি ঘটাচ্ছে কারণ আমি কোডটি আটকিয়েছি, আমি ভাবছি আমার সেগুলি অন্য কোথাও তৈরি করা উচিত
samayo

4

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

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

এর একটি অত্যন্ত তাৎপর্যপূর্ণ কারণ হ'ল ডকার আপনি সিস্টেমটেক্ট দিয়ে শুরু করা পরিষেবাগুলি পরিষ্কারভাবে বন্ধ করবেন না এবং বাস্তবে আপনি অপ্রত্যাশিত বিদ্যুৎ বিভ্রাট থেকে আসা একই ধরণের ডাটাবেস দুর্নীতিতে শেষ হতে পারেন।

এটি আরও গভীরভাবে ডুব দেওয়ার জন্য: ডকার যখন কোনও ধারককে "স্টপ" কমান্ড দেয়, তখন এটি সার্ভার এবং ডেমোনগুলিতে নয়, সিএমডি / ENTRYPOINT দিয়ে শুরু করা একমাত্র প্রক্রিয়া সাইনটারম সিগন্যাল প্রেরণ করে। যাতে একটি পরিষেবা পরিষ্কারভাবে বন্ধ করার সতর্কতা রাখে এবং অন্য সমস্তগুলি অনিয়মিতভাবে বন্ধ হয়ে যায়।

যদি আপনাকে অবশ্যই একই ধারকটিতে দুটি পরিষেবা প্যাকেজ করতে হয় (যেমন আপনার অ্যাপ্লিকেশন এবং পোস্টগ্রিএসকিউএল ডাটাবেস বা এর মতো কিছু) তবে আপনার সিএমডি / ENTRYPOINT এমন একটি স্ক্রিপ্ট হতে হবে যা সাইন্টর্মকে ধরে ফেলবে এবং তারপরে সেই পরিচিত পরিষেবাগুলিতে এটিকে পুনরায় সম্প্রচার করবে। এটি করা যেতে পারে তবে আপনি যদি সুযোগ পান তবে আপনার সমাধানটি পুনর্বিবেচনা করুন এবং এটিকে একাধিক পাত্রে ভাঙ্গার চেষ্টা করুন।

একটি সংযোজন

সুপারভাইজার ব্যবহার সম্পর্কে ডকারের সাইটে একটি আকর্ষণীয় নোট / পৃষ্ঠা রয়েছে যদি আপনার একই পাত্রে একাধিক পরিষেবা চলমান থাকে।


2

আমি এই সমস্যাটি একটি CentOS: 7 ডকারের ধারকটিতে সমাধান করতে পেরেছি। আমি মূলত সেন্টস ডকার ইমেজ প্রকল্পের গাইডটি অনুসরণ করেছি ।

FROM centos:7

ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# Install anything. The service you want to start must be a SystemD service.

CMD ["/usr/sbin/init"]

এখন, চিত্রটি তৈরি করুন এবং কমপক্ষে নিম্নলিখিত আর্গুমেন্টটি ব্যবহার করে এটি চালান docker run:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

তারপরে মূল বিষয়টি হ'ল /usr/sbin/initডকারের ধারকটির ভিতরে এটি অবশ্যই প্রথম প্রক্রিয়া।

সুতরাং আপনি যদি কোনও কাস্টম স্ক্রিপ্ট ব্যবহার করতে চান যা চালানোর আগে কিছু কমান্ড কার্যকর করে /usr/sbin/init, এটি আপনার স্ক্রিপ্টের শেষে exec /usr/sbin/init(ব্যাশ স্ক্রিপ্টে) ব্যবহার করে চালু করুন ।

এখানে একটি উদাহরণ:

ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh

CMD ["/usr/local/bin/cmd.sh"]

এবং এখানে লিখিত সামগ্রী cmd.sh:

#!/bin/bash

# Do some stuffs

exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8

আপনি System is booting up. See pam_nologin(8)যদি পিএএম সিস্টেম ব্যবহার করে থাকেন তবে সেই ক্ষেত্রে /usr/lib/tmpfiles.d/systemd-nologin.confআপনার মুছুন Dockerfileকারণ এটি ফাইল তৈরি করে /var/run/nologinযা এই নির্দিষ্ট ত্রুটিটি উত্পন্ন করে।


systemd-nologin.conf/ nologinজয়ের জন্য কারণ CentOS / RHEL 7 দাবিগুলি UsePAM noঅসমর্থিত এবং লগগুলিতে যেমন অভিযোগ করবে। নিশ্চিত না যে আরএইচ ওপেনশ বহনযোগ্য পোর্টেবল কোনওভাবে এটি প্যাচ করেছে / ভেঙে ফেলেছে বা তারা ভদ্র গ্রাহকদের কাছ থেকে তাদের সমর্থন পৃষ্ঠকে হ্রাস করার চেষ্টা করছে।

1

আমি আরম্ভ / পিআইডি হিসাবে সিস্টেমড লঞ্চ করতে চাইনি। অন্যদের দ্বারা বর্ণিত ক্লিনআপ ধাপগুলি করার পরে, আমি একটি স্টার্টআপ স্ক্রিপ্টের মধ্যে থেকে সিস্টেমড চালু করি /usr/lib/systemd/systemd --system &

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

আমার জন্য, অনুপস্থিত লিঙ্কটি ছিল / রান / সিস্টেমড / সিস্টেম ডিরেক্টরিটির অনুপস্থিতি, এটি সিস্টেমেটল straceইনগ্রেড দ্বারা আবিষ্কার করা হয়েছিল ।

Systemctl চালানোর আগে নিজেই এই ডিরেক্টরিটি তৈরি করা আমার পক্ষে সিস্টেমেটকে কাজ করার অনুমতি দেয়।

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