डी-बस कनेक्शन पाने में विफल: ऑपरेशन की अनुमति नहीं


29

मैं उपयोग कर रहे अपने डॉक में चल रहे सेंटो इमेज पर सेवाओं को सूचीबद्ध करने की कोशिश कर रहा हूं

systemctl list-units  

लेकिन मुझे यह त्रुटि संदेश मिला:

Failed to get D-Bus connection: Operation not permitted

कोई सुझाव क्या समस्या हो सकती है?


1
आपने उपयोग नहीं किया sudo?
माइकल हैम्पटन

यदि आपको इसकी आवश्यकता नहीं है, तो आपको सिस्टमड का उपयोग नहीं करना चाहिए। आवेदन को सीएमडी या आरयूएन में शुरू करने या एक आवरण स्क्रिप्ट का उपयोग करने का प्रयास करें।
नेल्लारो

यदि आपको systemdCentOS की आवश्यकता है, तो इस चित्र का उपयोग करें: FROM centos/systemd
james.garriss

जवाबों:


24

मेरा अनुमान है कि आप एक non-privilegedकंटेनर चला रहे हैं । systemd को CAP_SYS_ADMIN क्षमता की आवश्यकता होती है, लेकिन अधिक सुरक्षा को जोड़ने के लिए Docker उस क्षमता को गैर विशेषाधिकार प्राप्त कंटेनरों में छोड़ देता है।

systemd को कंटेनर के भीतर cgroup फ़ाइल सिस्टम के लिए RO पहुँच की आवश्यकता होती है। आप इसके साथ जोड़ सकते हैं–v /sys/fs/cgroup:/sys/fs/cgroup:ro

तो, यहाँ कुछ कदम कैसे डॉक कंटेनर के अंदर systemd के साथ CentOS चलाने के लिए:

  1. पुल सेंटोस छवि
  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. आपके कंटेनर में सिस्टमड होना चाहिए


काफी साफ़! हालाँकि, कम से कम मुझे अभी और जानकारी मिल रही है। यहाँ मैं लॉग इन कर रहा हूँ:[ 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
स्नोक्रैश

आपने मेरे उत्तर में कॉपी की गई डॉकरीफ़ाइल से अपनी छवि बनाई है, आप उस छवि से एक कंटेनर चलाते हैं, और आपको अभी भी एक त्रुटि मिलती है?
13dimitar

4
बिंगो! मैं /bin/bashएक शेल प्राप्त करने के लिए कंटेनर को चला रहा था । हालाँकि, इससे मुझे पहले बताई गई त्रुटि मिल गई। जब मैंने /usr/sbin/initसुझाव के साथ इसे चलाया तो एक खोल के साथ संलग्न सभी अच्छी तरह से चला गया। स्पष्ट रूप से मैं एक बारीकियों को याद कर रहा हूं /usr/sbin/init। यह उत्तर कुछ पर्याप्त उत्थान के योग्य है।
स्नोक्रैश

मैं 2 दिनों के लिए इस पर रहा हूं, और मैं अभी भी यह पता नहीं लगा सका हूं कि /sys/fs/cgroup:/sys/fs/cgroupयह क्या है या कहां से आ रहा है ... मुझे पता है कि अतिथि फ़ोल्डर कैसे माउंट करना है जैसे: /src/:/var/wwwलेकिन आपकी फाइल कहां से आ रही है? यह मेरे लिए बहुत सारी त्रुटियां पैदा कर रहा है क्योंकि मैंने कोड चिपकाया है, मैं सोच रहा हूं कि मुझे कहीं और बनाना चाहिए
samayo

4

यह आपके प्रश्न का सीधा उत्तर नहीं है, लेकिन यह वास्तव में अधिक महत्वपूर्ण हो सकता है, और मुझे इस अहसास का पता चला क्योंकि मैं यहाँ अन्य उत्तरों को पढ़ रहा था।

मेरे पास कुछ जटिल प्रणालियों को डोकर में स्थानांतरित करने का कुछ अनुभव है, और मेरे पास एक महत्वपूर्ण अहसास है कि आपको आदर्श रूप से प्रति एप्लिकेशन / सेवा या "प्रति डेमन" में एक डॉकर कंटेनर होना चाहिए।

इसका एक बहुत महत्वपूर्ण कारण यह है कि डॉकर सफाई से बंद होने वाली सेवाओं को नहीं करेगा, जो आप सिस्टेक्ट्ल के साथ शुरू करते हैं और वास्तव में आप एक ही प्रकार के डेटाबेस के भ्रष्टाचार से समाप्त हो सकते हैं जो एक अप्रत्याशित बिजली आउटेज से आते हैं।

इसे थोड़ा और गहरा करने के लिए: जब डॉकटर कंटेनर में "स्टॉप" कमांड जारी करता है, तो यह सिग्मर्ट सिग्नल को केवल एक ही प्रक्रिया भेजता है जो सीएमडी / एनटीआरपीओपीएनयूटी के साथ शुरू की गई थी, सभी सेवाओं और डेमन के लिए नहीं। ताकि एक सेवा में सफाई बंद करने की चेतावनी हो और बाकी सभी को बिना शर्त समाप्त कर दिया जाए।

यदि आपको पूरी तरह से एक ही कंटेनर में दो सेवाओं (यानी आपके आवेदन और एक PostgreSQL डेटाबेस या ऐसा कुछ) को पैकेज करना है तो आपको अपने CMD / ENTRYPOINT को एक स्क्रिप्ट होना चाहिए जो SIGTERM को पकड़ लेती है और फिर उन ज्ञात सेवाओं के लिए इसे रीबोड करता है। यह किया जा सकता है, लेकिन अगर आपके पास अवसर है, तो अपने समाधान पर पुनर्विचार करें और इसे कई कंटेनरों में तोड़ने का प्रयास करें।

एक परिशिष्ट

पर्यवेक्षक का उपयोग करने के बारे में डॉकर साइट पर एक दिलचस्प नोट / पृष्ठ है यदि आपको पूरी तरह से एक ही कंटेनर में कई सेवाएं चलाने की आवश्यकता है।


2

मैं इस मुद्दे को एक CentOS: 7 डॉकटर कंटेनर में ठीक करने में कामयाब रहा हूं। मैंने मुख्य रूप से CentOS Docker इमेज प्रोजेक्ट पर गाइड का अनुसरण किया है ।

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)यदि आपके पास PAM प्रणाली का उपयोग कर रहे हैं, तो उस स्थिति में, /usr/lib/tmpfiles.d/systemd-nologin.confअपने में हटाएं Dockerfileक्योंकि यह फ़ाइल बनाता है /var/run/nologinजो इस विशिष्ट त्रुटि को उत्पन्न करता है।


systemd-nologin.conf/ nologinजीत के लिए क्योंकि CentOS / RHEL 7 दावे UsePAM noअसमर्थित हैं और इस तरह लॉग में शिकायत करेंगे। यकीन नहीं होता कि आरएच ने पोर्टेबल पैच लगाया या इसे किसी तरह तोड़ा या वे नौसिखिए ग्राहकों से अपनी समर्थन सतह को कम करने की कोशिश कर रहे थे।

1

मैं init / PID 1 के रूप में systemd लॉन्च करना नहीं चाहता था। दूसरों द्वारा बताए गए सफाई चरणों को करने के बाद, मैं स्टार्टअप स्क्रिप्ट के भीतर से systemd लॉन्च करता हूं /usr/lib/systemd/systemd --system &

इससे सिस्टमड को पंजीकृत सेवाओं को शुरू करने और लॉन्च करने की अनुमति मिल गई, लेकिन डी-बस की त्रुटि के साथ सिस्टमक्टेल विफल हो रहा था।

मेरे लिए, गायब लिंक / रन / सिस्टमड / सिस्टम निर्देशिका की अनुपस्थिति थी, इसे straceआईएनजी सिस्टमक्टेल द्वारा खोजा गया था ।

व्यवस्थित करने से पहले मैन्युअल रूप से इस निर्देशिका का निर्माण करने से मुझे व्यवस्थित करने की अनुमति मिलती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.