D-Bus bağlantısı kurulamadı: İşleme izin verilmedi


29

Docker’da çalışan CentOS resmimin servislerini kullanmaya çalışıyorum

systemctl list-units  

ama bu hata mesajını alıyorum:

Failed to get D-Bus connection: Operation not permitted

Sorunun ne olabileceği konusunda herhangi bir öneriniz var mı?


1
Kullanmadın sudomı?
Michael Hampton

Gerekmiyorsa systemd kullanmamalısınız. Uygulamayı CMD veya RUN'da kullanmadan veya bir sarmalayıcı komut dosyası kullanarak başlatmayı deneyin.
nelaaro

systemdFROM centos/systemd
CentOS'a

Yanıtlar:


24

Tahminimce bir non-privilegedkonteyner işletiyorsun . systemd, CAP_SYS_ADMIN yeteneği gerektirir, ancak Docker bu özelliği ayrıcalıklı olmayan konteynerlere daha fazla güvenlik eklemek için bırakır.

systemd ayrıca bir kaptaki cgroup dosya sistemine RO erişimi gerektirir. İle ekleyebilirsiniz–v /sys/fs/cgroup:/sys/fs/cgroup:ro

Yani, CentOS’un bir Docker konteynerinde systemd ile nasıl çalıştırılacağına dair birkaç adım:

  1. Centos görüntüyü çekin
  2. Aşağıdaki gibi bir docker dosyası kurun:
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. İnşa et - docker build --rm -t centos7-systemd - < mydockerfile
  2. İle bir konteyner çalıştırın docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init

  3. Konteynerinizde systemd olması gerekirdi


Oldukça temiz! Ancak, en azından şimdi daha fazla bilgi alıyorum. İşte giriş yaptığım şey:[ 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.
Snowcrash

1
Açık olmasaydım diye! Hala hatayı alıyorumFailed to get D-Bus connection: Operation not permitted
Snowcrash

Cevabımdaki kopyalanan Dockerfile'den kendi resminizi oluşturdunuz, bu imgeden bir konteyner çalıştırdınız ve hala bir hata mı alıyorsunuz?
13dimitar

4
Bingo! /bin/bashBir kabuk almak için konteyneri birlikte çalıştırıyordum . Ancak bu bana daha önce belirtilen hatayı verdi. /usr/sbin/initÖnerildiği gibi koştuğumda bir kabuğa tutturulduğumda her şey yolunda gitti. Açıkçası nüansları kaçırıyorum /usr/sbin/init. Bu cevap önemli ölçüde olumlu eleştirileri hak ediyor.
Snowcrash

2 gündür bu işteyim, ve hala ne /sys/fs/cgroup:/sys/fs/cgroupolduğunu veya nereden geldiğini hala çözemiyorum ... Konuk klasörünü nasıl saklanacağını biliyorum: /src/:/var/wwwama dosyanız nereden geliyor? Bana birçok hataya neden oluyor, çünkü kodu yapıştırdım, bunları bir yerde oluşturmam gerektiğini düşünüyorum
samayo

4

Bu, sorunuza doğrudan bir cevap değildir, ancak aslında daha önemli olabilir ve buradaki diğer cevapları okurken bu farkına vardım.

Bazı karmaşık sistemleri Docker'a geçirme konusunda bazı deneyimlerim oldu ve yaşadığım en önemli gerçeklerden biri, her uygulama / hizmet veya bir "Daemon" için bir Docker konteynerine sahip olmanız gerektiğidir.

Bunun çok önemli bir nedeni Docker'ın systemctl ile başlattığınız hizmetleri net bir şekilde kapatmaması ve aslında beklenmedik bir elektrik kesintisinden kaynaklanan aynı türde veritabanı bozulmalarına neden olabilir.

Buna biraz daha derine dalmak için: Docker bir konteynere bir "dur" komutu verdiğinde, SIGTERM sinyalini yalnızca tüm servislere ve servislere değil, CMD / ENTRYPOINT ile başlatılan tek bir işlem gönderir. Böylece, bir hizmetin temiz bir şekilde kapanması uyarısı var ve diğerleri de kararsızca sonlandırılıyor.

İki servisi kesinlikle aynı kapta paketlemeniz gerekiyorsa (örneğin, uygulamanız ve bir PostgreSQL veritabanınız ya da bunun gibi bir şey), CMD / ENTRYPOINT'inizin SIGTERM'i yakalayan bir komut dosyası olması ve ardından bilinen hizmetlere yeniden yayınlaması gerekir. Yapılabilir, ancak fırsatınız varsa, çözümünüzü yeniden düşünün ve birden çok kaplara ayırmaya çalışın.

Zeyilname

Docker sitesinde , aynı kapta çalışan birden çok hizmetiniz olması durumunda süpervizörü kullanma hakkında ilginç bir not / sayfa var.


2

Bu sorunu bir CentOS: 7 Docker konteynerinde çözmeyi başardım. Genelde CentOS Docker Kılavuzu projesini izledim .

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"]

Şimdi, görüntüyü oluşturun ve docker runkomut vermek için en azından aşağıdaki argümanları kullanarak çalıştırın :-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro

Öyleyse ana nokta, /usr/sbin/initDocker kabının içindeki ilk işlem olması gerektiğidir.

Bu nedenle, çalıştırmadan önce bazı komutları çalıştıran özel bir komut dosyası kullanmak istiyorsanız /usr/sbin/init, komut dosyasını exec /usr/sbin/init(bash komut dosyasında) kullanarak başlatın .

İşte bir örnek:

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

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

Ve işte içeriği 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

Sen olabilir System is booting up. See pam_nologin(8)sizin PAM sistemi kullanarak eğer, bu durumda, silme /usr/lib/tmpfiles.d/systemd-nologin.confGözlerinde farklı Dockerfileo dosya oluşturur çünkü /var/run/nologinbu özel hatayı oluşturur.


systemd-nologin.conf/ nologingalibiyet için, çünkü CentOS / RHEL 7 iddiaları UsePAM nodesteklenmiyor ve kayıtlarda olduğu gibi şikayet edecek. RH openssh portatif'in bir şekilde yamalı / kırıldığından veya destek yüzeylerini acemi müşterilerden düşürmeye çalıştığından emin değil.

1

Systemd'yi init / PID 1 olarak başlatmak istemedim. Başkaları tarafından belirtilen temizleme adımlarını uyguladıktan sonra, systemd'yi bir başlangıç ​​betiğinden başladım /usr/lib/systemd/systemd --system &.

Bu, sistemd'in kayıtlı hizmetleri başlatmasına ve başlatmasına izin verdi, ancak systemctl D-Bus hatasıyla başarısız oldu.

Benim için, eksik olan bağlantı / run / systemd / system dizininin olmamasıydı, bunu stracesystemctl ile keşfetti .

Systemctl'i çalıştırmadan önce bu dizini elle oluşturmak, systemctl'nin benim için çalışmasına izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.