Arch Linux Dockerコンテナでsystemdサービスを実行するには?

Arch Linux Dockerコンテナでsystemdサービスを実行するには?

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インストールすることはできないので、あらかじめインストールされています。tmpfstmpfs/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翻訳はあなたのブラウザで機能する必要があると思います。ありがとう

おすすめ記事