Dockerコンテナでsystemdサービスを実行するためのさまざまな方法があるようです。最新の例は次のとおりです。直接提案--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro --cap-add=SYS_ADMIN --security-opt=seccomp:unconfined
しかし、まだ。失敗する:
エラー:サービスを開始できません。 [ntpd]: '/usr/sbin/systemctl start ntpd' 実行中 1 が返されました。バスに接続できません。そのファイルやディレクトリはありません。
最新のArch Linuxディストリビューションを含むdocker 1.12.1コンテナのsystemd 231で単純なサービスを実行するには、少なくとも何をすべきですか?
答え1
systemdが必要なAnsible Playbookのテスト中に同じ問題が発生しました。あなたが言ったように、コンテナを起動して終了するのは仮想マシンよりはるかに簡単なので、dockerが最善の方法のようです。
最初基本/アーチLinuxイメージは廃止されました。使用する必要があります。アーチLinux/ベース代わりに。その後、完全に権限なしでsystemdを実行するには、いくつかのタスクを実行する必要があります。
container=
systemdがハードウェアシステムを起動するときに通常実行する多くのタスクを実行しないように変数を指定します。- systemdはcgroupを積極的に使用するため、
/sys/fs/cgroup
ホストからファイルシステムをバインドマウントします。 /sys/fs/fuse
バンドルのインストールは必要ありませんが、ヒューズに依存するソフトウェア関連の問題を防ぐのに役立ちます。- systemdはどこでも使用するのが良いアイデアだと思いますが、権限のない方法で実行すると好きなところに
tmpfs
インストールすることはできないので、あらかじめインストールされています。tmpfs
tmpfs
/tmp
/run
/run/lock
- 最後に、コンテナ内でグラフィックアイテムを実行したくないので、デフォルトの
sysinit.target
実行単位として指定し、他のものは何も指定しないでください。multi-user.target
結果のコマンドラインは次のとおりです。
docker run \
--entrypoint=/usr/lib/systemd/systemd \
--env container=docker \
--mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup \
--mount type=bind,source=/sys/fs/fuse,target=/sys/fs/fuse \
--mount type=tmpfs,destination=/tmp \
--mount type=tmpfs,destination=/run \
--mount type=tmpfs,destination=/run/lock \
archlinux/base --log-level=info --unit=sysinit.target
あなたの例でntpdなどの特定のサービスを実行していることについて話している場合は、以下を追加する必要があります。
--cap-add=SYS_TIME
そうしないと、ntpd
誰もコンテナのデフォルト値をシステム時間に設定したくないため、権限が拒否され、失敗します。
PS 私はsystemdがどのように機能するかを学ぶのにかなりの時間を費やし、多くのOSイメージで動作するように管理しました。私は記事で私の経験を説明しました。Dockerコンテナでsystemdを実行する。ロシア語になっていますが、Google翻訳はあなたのブラウザで機能する必要があると思います。ありがとう