Dockerコンテナ内で systemd が実行できない!

経緯

Dockerコンテナ (ベースイメージは Ubuntu) の内部で,タイムゾーンを設定するために

			$ timedatectl set-timezone Asia/Tokyo
		

を実行したところ,以下のエラーメッセージが出てきました.

			System has not been booted with systemd as init system (PID 1).
			Can't operate. Failed to connect to bus: Host is down
		

和訳してみると

			システムは init システム (PID 1) として systemd によって起動されていません.
				実行できません.バスへの接続に失敗しました: ホストが終了しました
		

まずは「init? PID? なにそれ美味しいの?」ということで調べました.

これが PID や!

翔泳社「Linux教科書 LPICレベル1 Version4.0対応」に載っていました.

プロセスはPID(プロセスID)と呼ばれる固有の識別子を持っています。 PIDは、プロセスが開始したときに順番に割り当てられます。Linuxではシステムを起動すると、 まず最初にinitというプログラムが実行されます。そのため、initのPIDは常に1となります。 またプロセスは、そのプロセスを開始したユーザーから引き継がれたUID (ユーザーID) と、 グループを表すGID (グループID) も持っています。 UIDとGIDによって、そのプロセスがシステムのどの部分にアクセスできるかを制御しています。 つまりプロセスは、プロセスを実行したユーザー権限で動作することになります。

わかりやすいですね.つまり最初に紹介したエラーメッセージは,コンテナ内でシステムが 起動されたときに, init プロセスが実行されなかった,ということのようです.

じゃあどうすりゃいいんでしょうか?

systemd は諦めろ!

ニフティ株式会社のブログにわかりやすい記事が載っていました!
Dockerでsystemctlを使いたい! (2023.05.31 閲覧)

これで何とか Docker コンテナ内で systemd を実行することはできそうですが...

コンテナにおけるサービスの管理はsystemctlで行わねばならない、 というわけではないということに注意してください。 docker本来の機能は「特定のプロセスを1つだけ起動する」というものであり、 1コンテナで複数のプロセスを動作させることは推奨されていません。 つまり、コンテナ型仮想化は仮想環境を提供しますが、 通常のLinuxサーバとは異なり1プログラムを動かすために、 1台のコンテナを用いる運用が推奨されているということです。 よって、Dockerを利用する際は「1コンテナ1プロセス」を意識して サービスのパフォーマンスに重点を置いた運用をしていきましょう。

とも書かれていました.そもそも Docker は, がちゃがちゃシステムをいじることを想定していませんよ,ということですね.

そもそもの目的は,Docker コンテナ内でタイムゾーンを設定することでした. ということで systemd を使わずに設定する方法を調べてみると,

			$ echo 'Asia/Tokyo' > /etc/localtime
		

であっさりクリアできることがわかりました.何やねん!
[参考: How to change time-zone settings from the command line (2023.05.31 閲覧)]