systemctl falhou ao conectar-se ao barramento - docker ubuntu: 16.04 container

72

Estou tentando usar o systemctlcomando em um ubuntu:16.04contêiner de docker. Estou executando o seguinte comando ...

systemctl status ssh

No entanto, estou recebendo o erro ...

Failed to connect to bus: No such file or directory

Por que isto não está funcionando? Isso está relacionado ao Ubuntu em execução em um contêiner de docker? Como posso systemctltrabalhar corretamente?

Duncan Gravill
fonte
2
Useservice ssh start
Bidyut

Respostas:

50

Suponho que você inicie seu contêiner de encaixe com algo como

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

O problema agora é que o processo PID 1 do processo init /bin/bashnão é systemd. Confirme com ps aux.

Além disso, você está perdendo o dbus com a maneira de se comunicar. É daí que a sua mensagem de erro vem. Mas como o seu PID 1 não é systemd, não ajudará a instalar o dbus.

O melhor seria repensar a maneira como você planeja usar o docker. Não confie no systemd como gerenciador de processos, mas faça com que o contêiner do docker execute o aplicativo desejado em primeiro plano.

user228505
fonte
Serviços como o openssh-server estão configurados para efetuar logon no recurso syslog padrão. Como posso obter logs sshd sem depender do systemctl?
Parth Shah
@ParthShah, consulte a página de manual do sshd. O meu tem as seguintes opções: Ao chamá-lo com -D, você pode mantê-lo em primeiro plano. com -e você instrui-o a imprimir diretamente os logs. estes podem depois ser inspecionados da maneira do docker com docker log.
user228505
[FYI] estava recebendo este erro ao /sbin/initser um processo PID = 1. Adicionar --privileged=truecomo sugerido por @sonjaya sonjaya abaixo resolveu o problema.
DimG 29/01
linda resposta !!
Sachin Verma
11

Outros relataram um problema semelhante. Inicie o terminal e digite:

$ env

Você vê uma variável de ambiente como esta?

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

Onde id -uestá entre reticulares e não aspas simples. Essa variável é reinterpretada em um número geralmente 1000para usuários regulares e 0para superusuário (sudo).

Se a variável de ambiente XDG_RUNTIME_DIRnão existir, você precisará criá-la. A discussão completa está nas respostas do systemd da barra de ativação .

WinEunuuchs2Unix
fonte
2
Eu tentei isso sem sucesso. Como minha instância do Ubuntu 16.04 tem a forma de um contêiner de docker e não configurei nenhum usuário em que estou trabalhando root, usei a variável XDG_RUNTIME_DIR=/run/root/0sem êxito. Depois verifiquei a pasta /rune descobri que não há subpasta /run/root. Existe alguma maneira de obter uma mensagem de erro mais detalhada? Eu dei uma olhada, systemctl --helpmas não consegui ver uma maneira de obter mensagens de erro detalhadas.
Duncan Gravill
11
Estou com o mesmo problema e isso também não resolveu o meu problema. Alguma vez você já descobriu esse? @DuncanGravill
Roeland
3
@Roeland Sim. Fiz uma pergunta semelhante sobre SO, que teve uma resposta mais forte. Também recomendo assistir aos tutoriais de ritmo individual no site do Docker. É explicado (ligeiramente vagamente) naqueles vídeos como PID 1o que é geralmente systemdé substituído em um recipiente Docker com o recipiente EntryPoint .
Duncan Gravill
Brilhante, obrigado! Eu precisava disso para iniciar / gerenciar uma unidade de usuário a partir de uma unidade de sistema.
Adrian Günter
6

Se você está recebendo esse erro no Windows Subsystem for Linux (WSL), descobri que é porque o Docker não é suportado. Isso ocorre devido à falta de cgroups e outros pré-requisitos.

ijustlovemath
fonte
3

Tente o seguinte:

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

ou

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

será o mesmo resultado.

Aqui eu recebo do documento do Docker :

Por padrão, os contêineres do Docker são "sem privilégios" e não podem, por exemplo, executar um daemon do Docker dentro de um contêiner do Docker. Isso ocorre porque, por padrão, um contêiner não tem permissão para acessar nenhum dispositivo, mas um contêiner "privilegiado" recebe acesso a todos os dispositivos (consulte a documentação em dispositivos cgroups).

Quando o operador executa a docker run --privileged, o Docker permitirá o acesso a todos os dispositivos no host, além de definir algumas configurações no AppArmor ou SELinux para permitir que o contêiner tenha quase o mesmo acesso ao host que os processos em execução nos contêineres externos no host. . Informações adicionais sobre a execução com --privileged estão disponíveis no Blog do Docker.

sonjaya sonjaya
fonte
2
Você poderia explicar seu comando e a diferença para a pergunta aceita ?
Melebius
Bem-vindo ao AskUbuntu! Obrigado por tentar ajudar! Uma rápida revisão da documentação me leva a acreditar que você pode ter cometido um erro ou 2 neste comando. Se você quiser editá- lo e explicar o que está fazendo e como ele resolve o problema, envie um ping para mim e eu voltarei para lhe dar uma votação positiva!
Elder Geek
Quando você diz images_docker, você quer dizer o vanilla ubuntu: 16.04? Ou alguma outra coisa?
Parth Shah
2

Basta iniciar o dbusserviço:

/etc/init.d/dbus start
moovs
fonte
1

Você pode não estar executando o systemd , que é a implementação padrão do init no 16.04. Se você atualizou a partir do 14.04, provavelmente ainda está iniciando , e o resultado da execução do comando systemctl é a saída que você obteve.

Veja minha resposta em systemctl: comando não encontrado 16.04 server para mais.

Hugh Buntu
fonte
Mas este é um contêiner do Ubuntu, que por padrão não possui systemd e não teria inicio.
Stefan Lasiewski
o que? Ubuntu tem systemd por padrão
knocte 30/01
Stefan: Acredito que você esteja correto no caso do Docker.
Hugh Buntu
knocte: meu comentário aborda o caso da atualização de 14.04 (Upstart) para 16.04 (systemd). Ao executar a atualização da versão, o Upstart não é substituído pelo systemd por razões compreensíveis (como: não interromper o sistema). Em retrospecto, percebo que o processo de atualização da versão não seria usado no Docker. Veja o link que eu chamei. Vejo que várias respostas e comentários não consideram o caso específico do Docker, e procurarei isso quando responder no futuro.
Hugh Buntu
0

Dentro do contêiner do docker, acho que você pode atualizar o rc.d se ainda estiver enfrentando problemas com o systemd. Eu tentei com o update-rd.c e funciona.

NEERAJ SWARNKAR
fonte
0

Eu estava recebendo exatamente o mesmo erro e, em seguida, o executo com êxito sudo

sudo systemctl status ssh
Saif
fonte
11
você não deveria precisar sudodisso. Parece uma coincidência. Você pode testar novamente?
Zanna
11
@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 que -1? Acabei de publicar o que funcionou para mim.
Saif
voto negativo não era meu ...
Zanna