108 votes

Systemctl n'a pas réussi à se connecter au bus - conteneur docker ubuntu:16.04

Je suis en train d'essayer d'utiliser la commande systemctl dans un conteneur docker ubuntu:16.04. Je lance la commande suivante...

systemctl status ssh

Cependant, je reçois l'erreur...

Failed to connect to bus: No such file or directory

Pourquoi cela ne fonctionne-t-il pas ? Est-ce lié au fait qu'Ubuntu s'exécute dans un conteneur docker ? Comment puis-je faire en sorte que systemctl fonctionne correctement ?

73voto

JRSofty Points 463

Je suppose que vous démarrez votre conteneur Docker avec quelque chose comme

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

Le problème maintenant est que votre processus d'initialisation PID 1 est /bin/bash, pas systemd. Confirmez avec ps aux.

En plus de cela, vous manquez de dbus qui serait le moyen de communication. C'est de là que vient votre message d'erreur. Mais comme votre PID 1 n'est pas systemd, il ne servira à rien d'installer dbus.

Le mieux serait de repenser la façon dont vous prévoyez d'utiliser Docker. Ne comptez pas sur systemd en tant que gestionnaire de processus mais faites en sorte que le conteneur Docker exécute votre application souhaitée en premier plan.

19voto

WinEunuuchs2Unix Points 91128

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 -u est encadré par des backticks, pas des guillemets simples. Cette variable est réinterprétée en un numéro habituellement 1000 pour les utilisateurs réguliers et 0 pour l'utilisateur super (sudo).

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

12voto

exud Points 289

Il suffit de démarrer le service dbus :

/etc/init.d/dbus start

7voto

ijustlovemath Points 597

Si vous rencontrez cette erreur dans le sous-système Windows pour Linux (WSL), j'ai découvert que c'est parce que Docker n'est pas pris en charge. Cela est dû au manque de cgroups et autres prérequis.

4voto

sonjaya sonjaya Points 59

Essayez ceci :

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

ou

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

donnera le même résultat.

Ici, je récupère de la documentation 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. Cela est dû au fait qu'en tant que conteneur par défaut, il n'est pas autorisé à accéder à des périphériques, mais un conteneur "privilégié" obtient accès à tous les périphériques (voir la documentation sur les périphériques cgroups).

Lorsque l'opérateur exécute docker run --privileged, Docker autorisera l'accès à tous les périphériques de l'hôte ainsi que définira certaines configurations dans AppArmor ou SELinux pour permettre au conteneur d'avoir presque le même accès à l'hôte que les processus s'exécutant en dehors des conteneurs sur l'hôte. Des informations supplémentaires sur l'exécution avec --privileged sont disponibles sur le blog Docker.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X