systemctl ล้มเหลวในการเชื่อมต่อกับรถบัส - คอนเทนเนอร์ docker ubuntu: 16.04


72

ฉันพยายามใช้systemctlคำสั่งในubuntu:16.04คอนเทนเนอร์นักเทียบท่า ฉันใช้คำสั่งต่อไปนี้ ...

systemctl status ssh

อย่างไรก็ตามฉันได้รับข้อผิดพลาด ...

Failed to connect to bus: No such file or directory

ทำไมสิ่งนี้ถึงไม่ทำงาน สิ่งนี้เกี่ยวข้องกับ Ubuntu ที่กำลังทำงานอยู่ในคอนเทนเนอร์นักเทียบท่าหรือไม่ ฉันsystemctlจะทำงานอย่างถูกต้องได้อย่างไร


2
ใช้service ssh start
Bidyut

คำตอบ:


50

ฉันสมมติว่าคุณเริ่มต้นนักเทียบท่าคอนเทนเนอร์กับสิ่งที่ชอบ

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

ปัญหาตอนนี้คือกระบวนการเริ่มต้นของคุณ PID ​​1 คือ/bin/bashไม่ใช่ systemd ps auxยืนยันด้วย

นอกจากนั้นคุณยังขาด dbus ด้วยจะเป็นวิธีการสื่อสาร นี่คือที่ข้อความผิดพลาดของคุณมาจาก แต่เนื่องจาก PID 1 ของคุณไม่ใช่ systemd มันจะไม่ช่วยในการติดตั้ง dbus

ที่ดีที่สุดคือการคิดใหม่ในแบบที่คุณวางแผนที่จะใช้นักเทียบท่า อย่าพึ่งพา systemd ในฐานะผู้จัดการกระบวนการ แต่ให้ตัวเชื่อมต่อคอนเทนเนอร์เรียกใช้แอปพลิเคชันที่คุณต้องการในเบื้องหน้า


บริการเช่น openssh-server ได้รับการกำหนดค่าให้เข้าสู่ระบบความสะดวก syslog เริ่มต้น ฉันจะรับบันทึก sshd โดยไม่ต้องพึ่งพา systemctl ได้อย่างไร
Parth Shah

@ParthShah โปรดตรวจสอบหน้าคน sshd Mine มีตัวเลือกดังต่อไปนี้: โดย caling ด้วย -D คุณสามารถเก็บไว้ในเบื้องหน้า ด้วย -e คุณสั่งให้พิมพ์บันทึกโดยตรง docker logเหล่านี้สามารถแล้วต่อมามีการตรวจสอบวิธีที่นักเทียบท่าด้วย
228505

[FYI] ได้รับข้อผิดพลาดนี้เนื่องจาก/sbin/initเป็น PID = 1 กระบวนการ การเพิ่ม--privileged=trueตามที่แนะนำโดย @sonjaya sonjaya ด้านล่างแก้ไขการออก
DimG

คำตอบที่สวยงาม !!
Sachin Verma

11

คนอื่น ๆ รายงานปัญหาที่คล้ายกัน เริ่มต้นเทอร์มินัลแล้วพิมพ์:

$ env

คุณเห็นตัวแปรสภาพแวดล้อมเช่นนี้หรือไม่?

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

ที่อยู่id -uใน backticks ไม่ใช่คำพูดเดียว ตัวแปรนี้ตีความใหม่เป็นตัวเลขโดยปกติ1000สำหรับผู้ใช้ทั่วไปและ0สำหรับผู้ใช้ขั้นสูง (sudo)

หากXDG_RUNTIME_DIRไม่มีตัวแปรสภาพแวดล้อมคุณต้องสร้างมันขึ้นมา การอภิปรายเต็มรูปแบบอยู่ในคำตอบ Launchpad systemd


2
ฉันลองสิ่งนี้โดยไม่ประสบความสำเร็จ เนื่องจากอินสแตนซ์ Ubuntu 16.04 ของฉันมีรูปแบบของตัวเทียบท่าคอนเทนเนอร์และฉันไม่ได้ตั้งค่าผู้ใช้ใด ๆ ที่ฉันทำงานอยู่rootดังนั้นฉันจึงใช้ตัวแปรXDG_RUNTIME_DIR=/run/root/0โดยไม่ประสบความสำเร็จ แล้วฉันจะตรวจสอบโฟลเดอร์และพบว่าไม่มีโฟลเดอร์ย่อย/run /run/rootมีอยู่แล้วฉันจะได้รับข้อความแสดงข้อผิดพลาด verbose เพิ่มเติมหรือไม่ ฉันดูsystemctl --helpแต่ไม่เห็นวิธีรับข้อความแสดงข้อผิดพลาดโดยละเอียด
Duncan Gravill

1
ฉันมีปัญหาเดียวกันและสิ่งนี้ก็ไม่ได้แก้ปัญหาของฉัน คุณเคยคิดแบบนี้ @DuncanGravill
Roeland

3
@ โรแลนด์ใช่ ฉันถามคำถามที่คล้ายกันเกี่ยวกับ SO ซึ่งมีการตอบสนองที่ดีกว่า นอกจากนี้ฉันขอแนะนำให้ดูการสอนด้วยตนเองในเว็บไซต์ของนักเทียบท่า มันจะมีการอธิบาย (เล็กน้อยราง) ในวิดีโอเหล่านั้นวิธีการPID 1ที่มักจะsystemdถูกแทนที่ในภาชนะที่เทียบท่ากับภาชนะจุดเข้าใช้งาน
Duncan Gravill

ยอดเยี่ยมขอบคุณ! ฉันต้องการสิ่งนี้เพื่อเริ่ม / จัดการหน่วยผู้ใช้จากหน่วยระบบ
Adrian Günter

5

หากคุณได้รับข้อผิดพลาดนี้ในระบบย่อย Windows สำหรับ Linux (WSL) ฉันพบว่าเป็นเพราะ Docker ไม่ได้รับการสนับสนุน นี่เป็นเพราะขาดกลุ่ม cg และข้อกำหนดเบื้องต้นอื่น ๆ


3

ลองสิ่งนี้:

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

หรือ

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

จะเป็นผลลัพธ์เดียวกัน

ที่นี่ฉันได้รับจากเอกสารของนักเทียบท่า :

โดยค่าเริ่มต้นคอนเทนเนอร์ Docker เป็น“ unprivileged” และไม่สามารถรัน Docker daemon ภายในคอนเทนเนอร์ Docker ได้ นี่เป็นเพราะโดยค่าเริ่มต้นคอนเทนเนอร์ไม่ได้รับอนุญาตให้เข้าถึงอุปกรณ์ใด ๆ แต่คอนเทนเนอร์“ สิทธิ์” ได้รับการเข้าถึงอุปกรณ์ทั้งหมด (ดูเอกสารประกอบของอุปกรณ์ cgroups)

เมื่อโอเปอเรเตอร์รันการทำงานของนักเทียบท่า - แบบไม่สนับสนุนนักเทียบท่าจะเปิดใช้งานการเข้าถึงอุปกรณ์ทั้งหมดบนโฮสต์รวมทั้งตั้งค่าการกำหนดค่าบางอย่างใน AppArmor หรือ SELinux เพื่ออนุญาตให้คอนเทนเนอร์เข้าถึงการเข้าถึงโฮสต์เดียวกันเกือบทั้งหมด . ข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน --privileged มีอยู่ในบล็อกนักเทียบท่า


2
คุณสามารถอธิบายคำสั่งและความแตกต่างของคำถามที่ยอมรับได้หรือไม่
Melebius

ยินดีต้อนรับสู่ AskUbuntu! ขอบคุณที่พยายามช่วย! การตรวจทานเอกสารฉบับย่อทำให้ฉันเชื่อว่าคุณอาจมีข้อผิดพลาดหรือ 2 ในคำสั่งนี้ หากคุณเป็นคนใจดีที่จะแก้ไขและอธิบายสิ่งที่คุณกำลังทำอยู่และวิธีแก้ปัญหาให้ฉันและฉันจะกลับมาให้คุณโหวตขึ้น!
Elder Geek

เมื่อคุณพูด images_docker คุณหมายถึง vanilla ubuntu: 16.04 หรือไม่ หรืออย่างอื่น?
Parth Shah

1

คุณอาจไม่ได้รันsystemdซึ่งเป็นการเริ่มต้นใช้งานของinitในวันที่ 16.04 หากคุณอัปเกรดจาก 14.04 คุณมักจะยังคงพุ่งพรวดและผลการรันคำสั่งsystemctlคือผลลัพธ์ที่คุณได้รับ

ดูคำตอบของฉันที่systemctl: comand ไม่พบเซิร์ฟเวอร์ 16.04สำหรับข้อมูลเพิ่มเติม


แต่นี่เป็นคอนเทนเนอร์ Ubuntu ซึ่งโดยค่าเริ่มต้นจะไม่มี systemd และจะไม่มีการพุ่งพรวด
Stefan Lasiewski

อะไร? อูบุนตูได้ systemd โดยค่าเริ่มต้น
knocte

สเตฟาน: ฉันเชื่อว่าคุณถูกต้องในกรณีของนักเทียบท่า
Hugh Buntu

knocte: ความคิดเห็นของฉันครอบคลุมกรณีของการอัพเกรดจาก 14.04 (พุ่งพรวด) เป็น 16.04 (systemd) เมื่อทำการอัพเกรดเวอร์ชั่น Upstart จะไม่ถูกแทนที่ด้วย systemd ด้วยเหตุผลที่เข้าใจได้ (เช่น: ไม่ทำให้ระบบแตก) เมื่อมองย้อนกลับไปฉันรู้ว่ากระบวนการอัปเกรดจะไม่ใช้ใน Docker ดูลิงก์ที่ฉันโทรออก ฉันเห็นว่าคำตอบและความคิดเห็นจำนวนมากไม่สามารถพิจารณากรณีเฉพาะของนักเทียบท่าได้และฉันจะค้นหาสิ่งนั้นเมื่อตอบในอนาคต
Hugh Buntu


0

ภายใน container docker ฉันคิดว่าคุณสามารถ update-rc.d ถ้าคุณยังคงดิ้นรนกับ systemd ฉันพยายาม update-rd.c และใช้งานได้


0

ฉันได้รับข้อผิดพลาดเดียวกันแน่นอนจากนั้นฉันเรียกใช้สำเร็จด้วย sudo

sudo systemctl status ssh

1
คุณไม่ควรต้องการsudoสิ่งนั้น ดูเหมือนเป็นเรื่องบังเอิญ คุณกรุณาทดสอบอีกครั้งได้ไหม
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

ทำไม -1 ฉันเพิ่งโพสต์สิ่งที่ทำงานให้ฉัน
Saif

downvote ไม่ได้เป็นของฉัน ...
Zanna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.