web-dev-qa-db-ja.com

Linuxコマンド「systemctl status」がDockerコンテナー内で機能しない

コマンドsystemctl statusが機能していません。それはありません。私のコンテナはCentOS 7上にあります。systemctl statusを発行すると、結果が得られますFailed to get D-Bus connection: operation not permitted.

回帰

  1. 次にsystemdのアップグレードを検討しました。 /etc/yum/protected.d/system.confファイルを削除しました。次に、yum remove systemdを使用しました。 systemdバージョン219-19.el7_2.4がインストールされていることがわかります。私は実際にsystemdを削除しないようにNを選択します。次にsystemd-libs-219-19.el7_2.7.x86_64.rpmをインストールしました。次にsystemdバージョン2.7をインストールしました。次に、バージョンを特定するためだけにyum remove systemdを使用しました。 systemdバージョン219-19.el7_2.7がインストールされています。削除を中止するには、NOを選択します。 systemctlステータスはまだ機能しません。同じエラーが発生します:Failed to get D-Bus connection: operation not permitted.
  2. -privilegedフラグを使用して新しいDockerコンテナーを作成してみました。 -p 80:80オプションを使用すると、Docker runコマンドが失敗しました。
  3. -p 80:80コマンドでdocker runオプションを省略したところ、新しいコンテナに同じ問題が発生しました。
  4. docker run ... -v /sys/fs/cgroup:/sys/fs/cgroup:ro "オプションを使用してDockerコンテナーを作成しました。同じ問題が発生しました。

私はsystemctl statusがDockerコンテナ内で動作することを期待しています。

systemctl statusをDockerコンテナで動作させるにはどうすればよいですか?

3
Kiran

CentOS:7のDockerコンテナでこの問題を解決できました。私は主に CentOS Dockerイメージプロジェクトのガイド に従いました。

_FROM centos:7

ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# Install anything. The service you want to start must be a SystemD service.

CMD ["/usr/sbin/init"]
_

次に、イメージをビルドし、少なくとも以下の_docker run_コマンドへの引数を使用して実行します。_-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro_

次に重要な点は、_/usr/sbin/init_はDockerコンテナー内の最初のプロセスでなければならないということです。

したがって、_/usr/sbin/init_を実行する前にいくつかのコマンドを実行するカスタムスクリプトを使用する場合は、_exec /usr/sbin/init_を使用して(bashスクリプトで)スクリプトの最後に起動します。

次に例を示します。

_ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh

CMD ["/usr/local/bin/cmd.sh"]
_

そして、ここに_cmd.sh_の内容があります:

_#!/bin/bash

# Do some stuffs

exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8
_

PAMシステムを使用している場合はSystem is booting up. See pam_nologin(8)を使用できます。その場合、Dockerfileの_/usr/lib/tmpfiles.d/systemd-nologin.conf_を削除します。これは、この特定のエラーを生成するファイル_/var/run/nologin_を作成するためです。 。

3
Anthony O.

次のようにドッカーを実行してください、それは私にとってはうまくいきます、

docker run -it --privileged -p 10081:80 centos7 /bin/bash
0
user181758