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?

Duncan Gravill
fuente
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.

usuario228505
fuente
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 .

WinEunuuchs2Unix
fuente
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.

ijustlovemath
fuente
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.

sonjaya sonjaya
fuente
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
moovs
fuente
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.

Hugh Buntu
fuente
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.

NEERAJ SWARNKAR
fuente
0

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

sudo systemctl status ssh
Saif
fuente
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