ubuntu:16.04
dockerコンテナでsystemctl
コマンドを使用しようとしています。私は次のコマンドを実行しています...
systemctl status ssh
しかし、エラーが発生しています...
Failed to connect to bus: No such file or directory
なぜこれが機能しないのですか?これは、ドッカーコンテナーで実行されているUbuntuに関連していますか? systemctl
を正しく動作させるにはどうすればよいですか?
私はあなたが次のようなもので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に依存せず、ドッカーコンテナーで目的のアプリケーションをフォアグラウンドで実行します。
他の人も同様の問題を報告しています。ターミナルを起動して、次を入力します。
$ env
このような環境変数が表示されますか?
XDG_RUNTIME_DIR=/run/user/`id -u`
id -u
は、一重引用符ではなくバックティックで囲まれています。この変数は通常、通常のユーザーの場合は1000
、スーパーユーザー(Sudo)の場合は0
の数値に再解釈されます。
環境変数XDG_RUNTIME_DIR
が存在しない場合は、作成する必要があります。完全な議論は launchpad systemd Answers にあります。
Linux用Windowsサブシステム(WSL)でこのエラーが発生している場合、Dockerがサポートされていないためであることがわかりました。これは、cgroupの不足およびその他の前提条件によるものです。
これを試して:
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ブログで入手できます。
systemdを実行していない可能性があります。これはinitのデフォルト実装です16.04に。 14.04からアップグレードした場合、おそらくまだupstartを実行しており、systemctlcommandは取得した出力です。
systemctl:comand not found 16.04 server で私の答えを参照してください。
まったく同じエラーが発生していたので、Sudo
で正常に実行しました
Sudo systemctl status ssh
まだdockerコンテナ内で、systemdに苦労しているならupdate-rc.dができると思います。 update-rd.cを試してみましたが、動作します。