échec de la connexion de systemctl au bus - menu fixe: conteneur 16.04


72

J'essaie d'utiliser la systemctlcommande dans un ubuntu:16.04conteneur Docker. J'exécute la commande suivante ...

systemctl status ssh

Cependant je reçois l'erreur ...

Failed to connect to bus: No such file or directory

Pourquoi ça ne marche pas? Est-ce que cela est lié à l'exécution d'Ubuntu dans un conteneur Docker? Comment puis-je systemctltravailler correctement?


2
Utilisezservice ssh start
Bidyut

Réponses:


50

Je suppose que vous commencez votre conteneur Docker avec quelque chose comme

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

Le problème est maintenant que votre PID de processus d'initialisation 1 n'est /bin/bashpas systemd. Confirmez avec ps aux.

En plus de cela, il manque dbus avec serait le moyen de communiquer. C'est de là que vient votre message d'erreur. Mais comme votre PID 1 n'est pas systemd, l'installation de dbus ne vous aidera pas.

Le mieux serait de repenser la façon dont vous envisagez d’utiliser docker. Ne vous fiez pas à systemd en tant que gestionnaire de processus, mais demandez au conteneur de menu fixe d'exécuter l'application souhaitée au premier plan.


Des services tels que openssh-server sont configurés pour se connecter à l'utilitaire syslog par défaut. Comment puis-je obtenir les journaux sshd sans m'appuyer sur systemctl?
Parth Shah

@ParthShah, consultez la page de manuel sshd. Le mien a les options suivantes: En le calant avec -D, vous pouvez le garder au premier plan. avec -e, vous lui demandez d’imprimer directement les journaux. ceux-ci peuvent ensuite être inspectés à la manière docker avec docker log.
user228505

[FYI] recevait cette erreur avec le /sbin/initprocessus PID = 1. Ajouter --privileged=truecomme suggéré par @sonjaya Sonjaya ci-dessous a résolu le problème.
DimG

belle réponse !!
Sachin Verma le

11

D'autres ont signalé un problème similaire. Démarrez le terminal et tapez:

$ env

Voyez-vous une variable d'environnement comme celle-ci?

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

id -uest entouré de guillemets et non de guillemets simples. Cette variable est réinterprétée en un nombre généralement 1000destiné aux utilisateurs réguliers et 0au super utilisateur (sudo).

Si la variable d'environnement XDG_RUNTIME_DIRn'existe pas, vous devez la créer. La discussion complète se trouve dans le tableau de bord, les réponses systemd .


2
J'ai essayé sans succès. Comme mon instance Ubuntu 16.04 a la forme d’un conteneur Docker et que je n’ai pas configuré les utilisateurs sur lesquels je travaille root, j’ai donc utilisé la variable XDG_RUNTIME_DIR=/run/root/0, sans succès. Ensuite, j'ai vérifié le dossier /runet trouvé qu'il n'y avait pas de sous-dossier /run/root. Est-ce que je peux quand même obtenir un message d'erreur plus détaillé? J'ai jeté un coup d'œil systemctl --helpmais je ne voyais pas comment obtenir des messages d'erreur détaillés.
Duncan Gravill

1
J'ai le même problème et cela n'a pas non plus résolu mon problème. Avez-vous déjà découvert celui-ci @DuncanGravill
Roeland le

3
@ Roeland Oui. J'ai posé une question similaire sur le SO qui a eu une réponse plus forte. Je vous recommande également de regarder les didacticiels à votre rythme sur le site Web de Docker. Il est expliqué (légèrement vaguement) dans ces vidéos comment PID 1ce qui est habituellement systemdremplacé dans un conteneur Docker avec le conteneur Entrypoint .
Duncan Gravill

Génial, merci! J'avais besoin de cela pour démarrer / gérer une unité utilisateur à partir d'une unité système.
Adrian Günter

6

Si vous obtenez cette erreur dans le sous-système Windows pour Linux (WSL), c'est parce que Docker n'est pas pris en charge. Cela est dû au manque de groupes de contrôle et à d’autres conditions préalables.


3

Essaye ça:

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

ou

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

sera le même résultat.

Ici, je viens du doc de Docker :

Par défaut, les conteneurs Docker sont «non privilégiés» et ne peuvent pas, par exemple, exécuter un démon Docker à l'intérieur d'un conteneur Docker. En effet, par défaut, un conteneur n’est autorisé à accéder à aucun périphérique, mais un conteneur «privilégié» a accès à tous les périphériques (voir la documentation sur les périphériques cgroups).

Lorsque l'opérateur exécute l'exécution de docker --privileged, Docker activera l'accès à tous les périphériques de l'hôte et définira une configuration dans AppArmor ou SELinux afin d'autoriser le conteneur à presque le même accès que les processus exécutés à l'extérieur de l'hôte. . Des informations supplémentaires sur l'exécution avec --privileged sont disponibles sur le blog Docker.


2
Pourriez-vous expliquer votre commande et la différence par rapport à la question acceptée ?
Melebius

Bienvenue sur AskUbuntu! Merci d'avoir essayé d'aider! Un rapide examen de la documentation m'amène à penser que vous avez peut-être commis une erreur ou 2 dans cette commande. Si vous avez la gentillesse de le modifier et d’expliquer ce que vous faites et comment il résout le problème, envoyez-moi une requête ping et je reviendrai vous donner un vote positif!
Elder Geek

Quand vous dites images_docker, voulez-vous dire Ubuntu à la vanille: 16.04? Ou autre chose?
Parth Shah

2

Il suffit de démarrer le dbusservice:

/etc/init.d/dbus start

1

Vous n’exécutez peut-être pas systemd , qui est l’implémentation par défaut d’ init le 16.04. Si vous avez mis à niveau à partir de 14.04, vous êtes probablement toujours en train d'exécuter upstart , et le résultat de l'exécution de la commande systemctl est le résultat obtenu.

Voir ma réponse à systemctl: comand introuvable 16.04 serveur pour plus.


Mais il s’agit d’un conteneur Ubuntu, qui par défaut n’a pas systemd et n’a pas d’arrivée.
Stefan Lasiewski

quelle? Ubuntu a systemd par défaut
knocte

Stefan: Je pense que vous avez raison dans le cas de Docker.
Hugh Buntu

knocte: mon commentaire couvre le cas de la mise à niveau de 14.04 (Upstart) à 16.04 (systemd). Lors de la mise à niveau de la version, Upstart n'est pas remplacé par systemd pour des raisons compréhensibles (telles que: ne pas endommager le système). Rétrospectivement, je me rends compte que le processus de mise à niveau des versions ne serait pas utilisé dans Docker. Voir le lien que j'ai appelé. Je constate qu'un certain nombre de réponses et de commentaires ne parviennent pas à prendre en compte le cas spécifique de Docker et je le rechercherai lors d'une réponse ultérieure.
Hugh Buntu

0

Dans le conteneur de menu fixe, je pense que vous pouvez mettre à jour-rc.d si vous êtes toujours aux prises avec systemd. J'ai essayé avec update-rd.c et cela fonctionne.


0

Je recevais exactement la même erreur, puis je l’exécutais avec succès avec sudo

sudo systemctl status ssh

1
vous ne devriez pas avoir besoin sudode ça. On dirait une coïncidence. Pouvez-vous s'il vous plaît re-tester?
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

Pourquoi -1? Je viens de poster ce qui a fonctionné pour moi.
Saif

downvote n'était pas à moi ...
Zanna
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.