systemctl no pudo conectarse al bus - docker ubuntu: contenedor 16.04


72

Estoy tratando de usar el systemctlcomando en un ubuntu:16.04contenedor acoplable. Estoy ejecutando el siguiente comando ...

systemctl status ssh

Sin embargo, recibo el error ...

Failed to connect to bus: No such file or directory

¿Por qué esto no funciona? ¿Está esto relacionado con Ubuntu ejecutándose en un contenedor docker? ¿Cómo puedo llegar systemctla trabajar correctamente?


2
Usoservice ssh start
Bidyut,

Respuestas:


50

Supongo que comienzas tu contenedor acoplable con algo como

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

El problema ahora es que su proceso de inicio PID 1 es /bin/bash, no systemd. Confirmar con ps aux.

Además de eso, te estás perdiendo dbus con la forma de comunicarte. De aquí proviene su mensaje de error. Pero como su PID 1 no es systemd, no ayudará instalar dbus.

Lo mejor sería repensar la forma en que planea usar Docker. No confíe en systemd como administrador de procesos, sino que haga que el contenedor docker ejecute la aplicación deseada en primer plano.


Los servicios como openssh-server están configurados para iniciar sesión en la instalación de syslog predeterminada. ¿Cómo puedo obtener registros sshd sin depender de systemctl?
Parth Shah

@ParthShah, consulte la página de manual de sshd. El mío tiene las siguientes opciones: calificándolo con -D puede mantenerlo en primer plano. con -e le indica que imprima directamente los registros. estos luego se pueden inspeccionar con la ventana acoplable docker log.
user228505

[FYI] estaba recibiendo este error al /sbin/initser PID = 1 proceso. Agregar --privileged=truecomo lo sugiere @sonjaya sonjaya a continuación resolvió el problema.
DimG

hermosa respuesta !!
Sachin Verma

11

Otros han reportado un problema similar. Inicie la terminal y escriba:

$ env

¿Ves una variable de entorno como esta?

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

Donde id -uestá encerrado entre comillas, no comillas simples. Esta variable se reinterpreta en un número, generalmente 1000para usuarios normales y 0para superusuario (sudo).

Si la variable de entorno XDG_RUNTIME_DIRno existe, debe crearla. La discusión completa se encuentra en las respuestas del sistema de lanzamiento .


2
Intenté esto sin éxito. Como mi instancia de Ubuntu 16.04 tiene la forma de un contenedor acoplable y no he configurado ningún usuario con el que estoy trabajando root, utilicé la variable XDG_RUNTIME_DIR=/run/root/0sin éxito. Luego revisé la carpeta /runy descubrí que no hay subcarpeta /run/root. ¿Hay alguna forma de obtener un mensaje de error más detallado? Eché un vistazo systemctl --helppero no pude ver una forma de obtener mensajes de error detallados.
Duncan Gravill

1
Tengo el mismo problema y esto tampoco resolvió mi problema. ¿Alguna vez te diste cuenta de esto @DuncanGravill
Roeland

3
@Roeland Sí. Hice una pregunta similar sobre SO que tuvo una respuesta más fuerte. También recomiendo ver los tutoriales a su propio ritmo en el sitio web de Docker. En esos videos se explica (un poco vagamente) cómo se reemplaza PID 1generalmente systemden un contenedor Docker con el Punto de entrada del contenedor .
Duncan Gravill

Brillante, gracias! Necesitaba esto para iniciar / administrar una unidad de usuario desde una unidad del sistema.
Adrian Günter

6

Si recibe este error en el Subsistema de Windows para Linux (WSL), he descubierto que es porque Docker no es compatible. Esto se debe a la falta de cgroups y otros requisitos previos.


3

Prueba esto:

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

o

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

Será el mismo resultado.

Aquí obtengo del documento de Docker :

Por defecto, los contenedores Docker son "no privilegiados" y no pueden, por ejemplo, ejecutar un demonio Docker dentro de un contenedor Docker. Esto se debe a que, de forma predeterminada, un contenedor no tiene acceso a ningún dispositivo, pero un contenedor "privilegiado" tiene acceso a todos los dispositivos (consulte la documentación sobre dispositivos cgroups).

Cuando el operador ejecuta Docker Run --privileged, Docker permitirá el acceso a todos los dispositivos en el host, así como establecerá alguna configuración en AppArmor o SELinux para permitir que el contenedor tenga casi el mismo acceso al host que los procesos que se ejecutan fuera de los contenedores en el host. . Información adicional sobre cómo ejecutar con --privileged está disponible en el Blog de Docker.


2
¿Podría explicar su orden y la diferencia a la pregunta aceptada ?
Melebius

¡Bienvenido a AskUbuntu! ¡Gracias por intentar ayudar! Una revisión rápida de la documentación me lleva a creer que puede haber cometido un error o 2 en este comando. Si fuera tan amable de editarlo y explicar lo que está haciendo y cómo resuelve el problema, ¡envíeme un ping y volveré y le daré un voto positivo!
Élder Geek

Cuando dices images_docker, ¿te refieres al vainilla ubuntu: 16.04? ¿O algo mas?
Parth Shah

2

Simplemente inicie el dbusservicio:

/etc/init.d/dbus start

1

Es posible que no esté ejecutando systemd , que es la implementación predeterminada de init en 16.04. Si ha actualizado desde 14.04, que es más probable aún en marcha recién llegado , y el resultado de ejecutar el systemctl comando es la salida que tienes.

Vea mi respuesta en systemctl: comand 16.04 server no encontrado para más.


Pero este es un contenedor de Ubuntu, que por defecto no tiene systemd y no tendría un arranque.
Stefan Lasiewski

¿Qué? ubuntu tiene systemd por defecto
knocte

Stefan: Creo que tienes razón en el caso de Docker.
Hugh Buntu

knocte: mi comentario cubre el caso de la actualización de 14.04 (Upstart) a 16.04 (systemd). Al realizar la actualización de la versión, Upstart no se reemplaza con systemd por razones comprensibles (como: no romper el sistema). En retrospectiva, me doy cuenta de que el proceso de actualización de la versión no se usaría en Docker. Vea el enlace que llamé. Veo que varias respuestas y comentarios no tienen en cuenta el caso específico de Docker, y lo buscaré cuando responda en el futuro.
Hugh Buntu

0

Dentro del contenedor docker, creo que puedes actualizar-rc.d si todavía tienes problemas con systemd. Intenté con update-rd.c y funciona.


0

Recibía exactamente el mismo error y luego lo ejecuté con éxito con sudo

sudo systemctl status ssh

1
no deberías necesitar sudopara eso. Parece una coincidencia. ¿Puedes volver a hacer la prueba?
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

¿Por qué -1? Acabo de publicar lo que funcionó para mí.
Saif

el voto negativo no era mío ...
Zanna
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.