web-dev-qa-db-fra.com

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

J'essaie d'utiliser la commande systemctl dans un conteneur de docker ubuntu:16.04. 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 faire en sorte que systemctl fonctionne correctement?

61
Duncan Gravill

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 que votre PID de processus d'initialisation 1 est /bin/bash, pas 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.

40
user228505

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 placé entre guillemets, pas de guillemets simples. Cette variable est réinterprétée sous la forme d'un nombre, généralement 1000 pour les utilisateurs normaux et 0 pour le super-utilisateur (Sudo).

Si la variable d'environnement XDG_RUNTIME_DIR n'existe pas, vous devez la créer. La discussion complète est dans réponses du tableau de bord systemd .

9
WinEunuuchs2Unix

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
ijustlovemath

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 reçois de la 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 autorisera 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 à l'hôte que les processus exécutés à l'extérieur des conteneurs sur l'hôte. . Des informations supplémentaires sur l'exécution avec --privileged sont disponibles sur le blog Docker.

3
sonjaya sonjaya

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

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

1
Hugh Buntu

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
NEERAJ SWARNKAR