systemctl gagal terhubung ke bus - docker ubuntu: 16.04 container

72

Saya mencoba menggunakan systemctlperintah dalam ubuntu:16.04wadah buruh pelabuhan. Saya menjalankan perintah berikut ...

systemctl status ssh

Namun saya mendapatkan kesalahan ...

Failed to connect to bus: No such file or directory

Mengapa ini tidak berhasil? Apakah ini terkait dengan Ubuntu yang berjalan dalam wadah buruh pelabuhan? Bagaimana saya bisa systemctlbekerja dengan benar?

Duncan Gravill
sumber
2
Gunakanservice ssh start
Bidyut

Jawaban:

50

Saya menganggap Anda memulai wadah buruh pelabuhan Anda dengan sesuatu seperti

docker run -t -i ubuntu:16.04 /bin/bash

Masalahnya sekarang adalah bahwa proses init Anda PID 1 adalah /bin/bash, bukan systemd. Konfirmasikan dengan ps aux.

Selain itu Anda kehilangan dbus dengan akan menjadi cara untuk berkomunikasi. Di sinilah pesan kesalahan Anda berasal. Tetapi karena PID 1 Anda bukan systemd, itu tidak akan membantu untuk menginstal dbus.

Yang terbaik adalah memikirkan kembali cara Anda berencana menggunakan buruh pelabuhan. Jangan mengandalkan systemd sebagai manajer proses tetapi biarkan buruh pelabuhan menjalankan aplikasi yang Anda inginkan di latar depan.

pengguna228505
sumber
Layanan seperti openssh-server dikonfigurasikan untuk masuk ke fasilitas syslog default. Bagaimana saya bisa mendapatkan log sshd tanpa mengandalkan systemctl?
Parth Shah
@ParthShah silakan periksa halaman manual sshd. Milik saya memiliki opsi berikut: Dengan menekannya dengan -D Anda dapat menyimpannya di latar depan. dengan -e Anda menginstruksikannya untuk langsung mencetak log. ini kemudian dapat diperiksa dengan cara buruh pelabuhan docker log.
user228505
[FYI] mendapatkan kesalahan ini dengan /sbin/initmenjadi proses PID = 1. Menambahkan --privileged=trueseperti yang disarankan oleh @sonjaya sonjaya di bawah ini memecahkan masalah tersebut.
DimG
jawaban yang indah !!
Sachin Verma
11

Yang lain melaporkan masalah yang sama. Mulai terminal dan ketik:

$ env

Apakah Anda melihat variabel lingkungan seperti ini?

XDG_RUNTIME_DIR=/run/user/`id -u`

Di mana id -uterlampir dalam backticks bukan tanda kutip tunggal. Variabel ini ditafsirkan kembali menjadi angka yang biasanya 1000untuk pengguna biasa dan 0untuk pengguna super (sudo).

Jika variabel lingkungan XDG_RUNTIME_DIRtidak ada, Anda harus membuatnya. Diskusi lengkap ada di launchpad systemd jawaban .

WinEunuuchs2Unix
sumber
2
Saya mencoba ini tanpa hasil. Sebagai contoh Ubuntu 16.04 saya berbentuk wadah buruh pelabuhan dan saya belum mengatur pengguna tempat saya bekerja root, jadi saya menggunakan variabel XDG_RUNTIME_DIR=/run/root/0, tanpa hasil. Kemudian saya memeriksa folder /rundan menemukan bahwa tidak ada subfolder /run/root. Apakah di sana saya bisa mendapatkan pesan kesalahan yang lebih banyak? Saya telah melihat systemctl --helptetapi tidak bisa melihat cara untuk mendapatkan pesan kesalahan rinci.
Duncan Gravill
1
Saya mengalami masalah yang sama dan ini juga tidak menyelesaikan masalah saya. Apakah Anda pernah memikirkan yang ini @DuncanGravill
Roeland
3
@Roeland Ya. Saya mengajukan pertanyaan serupa pada SO yang memiliki respons lebih kuat. Saya juga merekomendasikan menonton tutorial Self-Paced di situs web Docker. Dijelaskan (sedikit samar-samar) dalam video tersebut bagaimana PID 1yang biasanya systemddiganti dalam wadah Docker dengan Entrypoint wadah .
Duncan Gravill
Cemerlang, terima kasih! Saya membutuhkan ini untuk memulai / mengelola unit pengguna dari unit sistem.
Adrian Günter
6

Jika Anda mendapatkan kesalahan ini di Subsistem Windows untuk Linux (WSL), saya menemukan itu karena Docker tidak didukung. Ini karena kurangnya cgroup dan prasyarat lainnya.

ijustlovemath
sumber
3

Coba ini:

docker run -ti -d --privileged=true images_docker  "/sbin/init"

atau

docker run -ti -d --privileged=true images_docker

akan hasil yang sama.

Di sini saya dapatkan dari dokumen Docker :

Secara default, wadah Docker adalah "unprivileged" dan tidak bisa, misalnya, menjalankan daemon Docker di dalam wadah Docker. Ini karena secara default sebuah wadah tidak diperbolehkan untuk mengakses perangkat apa pun, tetapi sebuah wadah yang "istimewa" diberikan akses ke semua perangkat (lihat dokumentasi pada perangkat cgroups).

Ketika operator mengeksekusi docker run --privileged, Docker akan memungkinkan akses ke semua perangkat di host serta mengatur beberapa konfigurasi di AppArmor atau SELinux untuk memungkinkan wadah hampir semua akses yang sama ke host ketika proses menjalankan kontainer di luar di host. . Informasi tambahan tentang menjalankan dengan --privileged tersedia di Docker Blog.

sonjaya sonjaya
sumber
2
Bisakah Anda menjelaskan perintah Anda dan perbedaannya dengan pertanyaan yang diterima ?
Melebius
Selamat datang di AskUbuntu! Terima kasih telah mencoba membantu! Tinjauan singkat terhadap dokumentasi membuat saya yakin Anda mungkin telah membuat kesalahan atau 2 dalam perintah ini. Jika Anda akan sangat baik untuk mengeditnya dan menjelaskan apa yang Anda lakukan dan bagaimana cara memecahkan masalah, ping saya dan saya akan kembali dan memberi Anda upvote!
Penatua Geek
Ketika Anda mengatakan images_docker, maksud Anda vanilla ubuntu: 16.04? Atau sesuatu yang lain?
Parth Shah
2

Mulai saja dbuslayanan:

/etc/init.d/dbus start
moovs
sumber
1

Anda mungkin tidak menjalankan systemd , yang merupakan implementasi standar init pada 16.04. Jika Anda memutakhirkan dari 14,04, kemungkinan besar Anda masih menjalankan pemula , dan hasil menjalankan perintah systemctl adalah output yang Anda dapatkan.

Lihat jawaban saya di systemctl: comand tidak ditemukan server 16.04 untuk lebih.

Hugh Buntu
sumber
Tapi ini wadah Ubuntu, yang secara default tidak memiliki systemd dan tidak akan memiliki pemula.
Stefan Lasiewski
apa? ubuntu memiliki systemd secara default
knocte
Stefan: Saya yakin Anda benar dalam kasus Docker.
Hugh Buntu
knocte: komentar saya mencakup kasus peningkatan dari 14,04 (pemula) ke 16,04 (systemd). Saat melakukan peningkatan versi, Upstart tidak diganti dengan systemd untuk alasan yang dapat dimengerti (seperti: tidak merusak sistem). Dalam retrospeksi, saya menyadari proses peningkatan rilis tidak akan digunakan di Docker. Lihat tautan yang saya panggil. Saya melihat bahwa sejumlah jawaban dan komentar gagal untuk mempertimbangkan kasus spesifik Docker, dan saya akan mencarinya ketika menjawab di masa depan.
Hugh Buntu
0

Di dalam wadah buruh pelabuhan, saya pikir Anda dapat memperbarui-rc.d jika Anda masih berjuang dengan systemd. Saya mencoba dengan update-rd.c dan berhasil.

NEERAJ SWARNKAR
sumber
0

Saya mendapatkan kesalahan yang sama persis dan kemudian saya jalankan dengan sukses sudo

sudo systemctl status ssh
Saif
sumber
1
kamu tidak perlu sudountuk itu. Sepertinya kebetulan. Bisakah Anda tes ulang?
Zanna
1
@Zannasaif@sr-server:~$ systemctl status ssh Failed to connect to bus: No such file or directory saif@sr-server:~$ sudo systemctl status ssh [sudo] password for saif: ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-01-19 23:38:14 PKT; 4min 4s ago Main PID: 18222 (sshd) Tasks: 15 Memory: 32.7M CPU: 488ms
Saif
Kenapa -1? Saya baru saja memposting apa yang berhasil untuk saya.
Saif
downvote bukan milikku ...
Zanna