web-dev-qa-db-ja.com

systemctlがバスに接続できませんでした-docker ubuntu:16.04 container

ubuntu:16.04 dockerコンテナでsystemctlコマンドを使用しようとしています。私は次のコマンドを実行しています...

systemctl status ssh

しかし、エラーが発生しています...

Failed to connect to bus: No such file or directory

なぜこれが機能しないのですか?これは、ドッカーコンテナーで実行されているUbuntuに関連していますか? systemctlを正しく動作させるにはどうすればよいですか?

68
Duncan Gravill

私はあなたが次のようなものでDockerコンテナを起動すると仮定します

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

問題は、initプロセスのPID 1が/bin/bashであり、systemdではないことです。 ps auxで確認します。

それに加えて、dbus withが欠落していることが通信方法です。これがエラーメッセージの発信元です。ただし、PID 1はsystemdではないため、dbusをインストールしても役に立ちません。

最善の方法は、Dockerの使用方法を再考することです。プロセスマネージャーとしてsystemdに依存せず、ドッカーコンテナーで目的のアプリケーションをフォアグラウンドで実行します。

49
user228505

他の人も同様の問題を報告しています。ターミナルを起動して、次を入力します。

$ env

このような環境変数が表示されますか?

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

id -uは、一重引用符ではなくバックティックで囲まれています。この変数は通常、通常のユーザーの場合は1000、スーパーユーザー(Sudo)の場合は0の数値に再解釈されます。

環境変数XDG_RUNTIME_DIRが存在しない場合は、作成する必要があります。完全な議論は launchpad systemd Answers にあります。

11

Linux用Windowsサブシステム(WSL)でこのエラーが発生している場合、Dockerがサポートされていないためであることがわかりました。これは、cgroupの不足およびその他の前提条件によるものです。

3
ijustlovemath

これを試して:

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

または

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

同じ結果になります。

ここで Dockerのドキュメント から取得します。

デフォルトでは、Dockerコンテナは「非特権」であり、たとえばDockerコンテナ内でDockerデーモンを実行することはできません。これは、デフォルトでは、コンテナはどのデバイスにもアクセスできないが、「特権」コンテナにはすべてのデバイスへのアクセスが許可されるためです(cgroupsデバイスのドキュメントを参照)。

オペレーターがdocker run --privilegedを実行すると、Dockerはホスト上のすべてのデバイスへのアクセスを有効にし、AppArmorまたはSELinuxでいくつかの構成を設定して、ホスト上のコンテナーの外部で実行されているプロセスとほぼ同じアクセスをコンテナーに許可します。 --privilegedを使用した実行に関する追加情報は、Dockerブログで入手できます。

3
sonjaya sonjaya

systemdを実行していない可能性があります。これはinitのデフォルト実装です16.04に。 14.04からアップグレードした場合、おそらくまだupstartを実行しており、systemctlcommandは取得した出力です。

systemctl:comand not found 16.04 server で私の答えを参照してください。

1
Hugh Buntu

まったく同じエラーが発生していたので、Sudoで正常に実行しました

Sudo systemctl status ssh
0
Saif

まだdockerコンテナ内で、systemdに苦労しているならupdate-rc.dができると思います。 update-rd.cを試してみましたが、動作します。

0
NEERAJ SWARNKAR