systemctl không thể kết nối với bus - docker ubfox: 16.04 container


72

Tôi đang cố gắng sử dụng systemctllệnh trong một ubuntu:16.04container docker. Tôi đang chạy lệnh sau ...

systemctl status ssh

Tuy nhiên, tôi đang nhận được lỗi ...

Failed to connect to bus: No such file or directory

Tại sao cái này không hoạt động? Điều này có liên quan đến Ubuntu đang chạy trong một container docker không? Làm thế nào tôi có systemctlthể làm việc chính xác?


2
Sử dụngservice ssh start
Bidyut

Câu trả lời:


50

Tôi giả sử bạn bắt đầu container docker của bạn với một cái gì đó như

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

Vấn đề bây giờ là quy trình init 1 của bạn /bin/bashchứ không phải systemd. Xác nhận với ps aux.

Thêm vào đó, bạn đang thiếu dbus sẽ là cách để giao tiếp. Đây là nơi thông báo lỗi của bạn đến từ. Nhưng vì PID 1 của bạn không phải là systemd, nó sẽ không giúp cài đặt dbus.

Tốt nhất là nghĩ lại cách bạn dự định sử dụng docker. Không dựa vào systemd như một trình quản lý quy trình nhưng để bộ chứa docker chạy ứng dụng bạn muốn ở nền trước.


Các dịch vụ như openssh-server được cấu hình để đăng nhập vào cơ sở nhật ký hệ thống mặc định. Làm thế nào tôi có thể nhận được các bản ghi sshd mà không cần dựa vào systemctl?
Parth Shah

@ParthShah vui lòng kiểm tra trang sshd man. Của tôi có các tùy chọn sau: Bằng cách làm dịu nó với -D, bạn có thể giữ nó ở phía trước. với -e bạn hướng dẫn nó in trực tiếp nhật ký. những cái này sau đó có thể được kiểm tra theo cách docker với docker log.
dùng228505

[FYI] đã nhận được lỗi này với /sbin/initquy trình PID = 1. Việc thêm --privileged=truenhư được đề xuất bởi @sonjaya sonjaya dưới đây đã giải quyết được vấn đề.
DimG

câu trả lời đẹp !!
Sachin Verma

11

Những người khác đã báo cáo một vấn đề tương tự. Khởi động thiết bị đầu cuối và gõ:

$ env

Bạn có thấy một biến môi trường như thế này không?

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

Trường hợp id -uđược bao trong backticks không trích dẫn duy nhất. Biến này được diễn giải lại thành một số thường 1000dành cho người dùng thông thường và 0siêu người dùng (sudo).

Nếu biến môi trường XDG_RUNTIME_DIRkhông tồn tại, bạn cần tạo nó. Các cuộc thảo luận đầy đủ là trong launchpad systemd câu trả lời .


2
Tôi đã thử điều này mà không thành công. Vì phiên bản Ubuntu 16.04 của tôi có dạng thùng chứa docker và tôi chưa thiết lập bất kỳ người dùng nào tôi đang làm việc root, vì vậy tôi đã sử dụng biến XDG_RUNTIME_DIR=/run/root/0, nhưng không thành công. Sau đó, tôi đã kiểm tra thư mục /runvà thấy rằng không có thư mục con /run/root. Có dù sao tôi có thể nhận được một thông báo lỗi dài dòng hơn? Tôi đã xem systemctl --helpnhưng không thể thấy cách nhận thông báo lỗi chi tiết.
Duncan Gravill

1
Tôi đang có cùng một vấn đề và điều này cũng không giải quyết được vấn đề của tôi. Bạn đã bao giờ tìm ra điều này @DuncanGravill
Roeland

3
@Roeland Có. Tôi đã hỏi một câu hỏi tương tự về SO có phản ứng mạnh mẽ hơn. Ngoài ra, tôi khuyên bạn nên xem các hướng dẫn Tự nhịp độ trên trang web Docker. Nó được giải thích (hơi mơ hồ) trong các video PID 1đó về cách thường systemdđược thay thế trong một container Docker với Entrypoint container .
Duncan Gravill

Rực rỡ, cảm ơn! Tôi cần điều này để bắt đầu / quản lý một đơn vị người dùng từ một đơn vị hệ thống.
Adrian Günter

5

Nếu bạn gặp lỗi này trong Hệ thống con Windows cho Linux (WSL), tôi đã tìm thấy lỗi này vì Docker không được hỗ trợ. Điều này là do thiếu các nhóm và các điều kiện tiên quyết khác.


3

Thử đi:

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

hoặc là

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

sẽ có kết quả tương tự.

Ở đây tôi lấy từ tài liệu của Docker :

Theo mặc định, các bộ chứa Docker là các bộ phận không được ưu tiên và không thể chạy, ví dụ, chạy một trình nền Docker bên trong một bộ chứa Docker. Điều này là do theo mặc định, một container không được phép truy cập vào bất kỳ thiết bị nào, nhưng một container container có đặc quyền của Nether được cấp quyền truy cập vào tất cả các thiết bị (xem tài liệu về các thiết bị cgroups).

Khi người vận hành thực thi docker chạy - đặc quyền, Docker sẽ cho phép truy cập vào tất cả các thiết bị trên máy chủ cũng như đặt một số cấu hình trong AppArmor hoặc SELinux để cho phép bộ chứa gần như tất cả quyền truy cập vào máy chủ như các tiến trình chạy bên ngoài máy chủ trên máy chủ . Thông tin bổ sung về việc chạy với --privileged có sẵn trên Blog Docker.


2
Bạn có thể giải thích lệnh của bạn và sự khác biệt cho câu hỏi được chấp nhận ?
Melebius

Chào mừng bạn đến với AskUbfox! Cảm ơn bạn vi đa cô găng giup! Việc xem xét nhanh tài liệu khiến tôi tin rằng bạn có thể đã mắc lỗi hoặc 2 trong lệnh này. Nếu bạn thật tử tế khi chỉnh sửa nó và giải thích những gì bạn đang làm và cách giải quyết vấn đề, hãy ping tôi và tôi sẽ quay lại và cung cấp cho bạn một upvote!
Elder Geek

Khi bạn nói hình ảnh_docker, bạn có nghĩa là vanilla ubfox: 16.04? Hay cái gì khác?
Parth Shah

1

Bạn có thể không chạy systemd , đây là cài đặt init mặc định vào ngày 16.04. Nếu bạn đã nâng cấp từ 14.04, rất có thể bạn vẫn đang chạy mới bắt đầu và kết quả của việc chạy lệnh systemctl là đầu ra bạn nhận được.

Xem câu trả lời của tôi tại systemctl: comand không tìm thấy máy chủ 16.04 để biết thêm.


Nhưng đây là một bộ chứa Ubuntu, theo mặc định không có systemd và sẽ không khởi động.
Stefan Lasiewski

gì? Ubuntu có mặc định systemd
knocte

Stefan: Tôi tin rằng bạn đúng trong trường hợp Docker.
Hugh Buntu

knocte: nhận xét của tôi bao gồm trường hợp nâng cấp từ 14.04 (Khởi động) lên 16.04 (systemd). Khi thực hiện nâng cấp phiên bản, Upstart không được thay thế bằng systemd vì những lý do dễ hiểu (như: không phá vỡ hệ thống). Nhìn lại, tôi nhận ra quy trình nâng cấp phát hành sẽ không được sử dụng trong Docker. Xem liên kết tôi gọi ra. Tôi thấy rằng một số câu trả lời và nhận xét không xem xét trường hợp cụ thể của Docker và tôi sẽ tìm kiếm điều đó khi trả lời trong tương lai.
Hugh Buntu

1

Chỉ cần bắt đầu dbusdịch vụ:

/etc/init.d/dbus start

0

Bên trong container docker, tôi nghĩ bạn có thể cập nhật-rc.d nếu bạn vẫn đang vật lộn với systemd. Tôi đã thử với update -rd.c và nó hoạt động.


0

Tôi đã nhận được cùng một lỗi chính xác và sau đó tôi chạy nó thành công với sudo

sudo systemctl status ssh

1
bạn không cần sudocho điều đó. Có vẻ như một sự trùng hợp. Bạn có thể vui lòng kiểm tra lại?
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

Tại sao -1? Tôi chỉ đăng những gì làm việc cho tôi.
Saif

downvote không phải của tôi ...
Zanna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.