GitHub Codespacesコンテナ内でtimedatectlがタイムゾーンを変更できない問題

なぜコンテナ内でtimedatectlがタイムゾーンを変更できないのか?

GitHub Codespaces(またはDockerコンテナ、WSL)のような環境で、標準的なsystemdコマンドを使用してタイムゾーンを変更しようとすると、次のようなエラーが発生することがあります。

$ timedatectl set-timezone Asia/Shanghai

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)の違いにあります。

  • 従来のLinuxシステム(仮想マシン/物理サーバー):システム起動時の最初のプロセス(PID 1)は通常、systemdです。timedatectlツールはsystemdのクライアントであり、D-Busを介してsystemdデーモンにリクエストを送信してシステム時刻の設定を変更します。
  • コンテナ環境(Docker/Codespaces):コンテナは軽量な環境として設計されており、完全なsystemd初期化システムを稼働させることはありません。コンテナ内のPID 1は、通常シェル(/bin/bash)または特定のアプリケーションのエントリーポイントです。

結論:systemdデーモンが稼働していないため、それに依存するtimedatectlは機能しません。

解決策

systemdに依存せずに、ファイルのシンボリックリンクを変更したり環境変数を設定したりすることで、同じ目的を達成できます。

方法1:/etc/localtimeを変更する(システム全体、推奨)

これは最も汎用的なLinuxタイムゾーン変更方法で、システムのタイムゾーンファイルを特定のタイムゾーンデータへのシンボリックリンクにします。

# 1. (任意) 古いタイムゾーンリンクを削除またはバックアップ
sudo rm -f /etc/localtime

# 2. 上海タイムゾーンへのシンボリックリンクを作成
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 3. (互換性のため) タイムゾーン名をファイルに書き込む (一部のアプリケーションが読み取ります)
echo "Asia/Shanghai" | sudo tee /etc/timezone > /dev/null

# 4. 設定を確認
date
# 出力にCSTが含まれるはず

方法2:TZ環境変数を設定する(ユーザー単位/一時的)

システムファイルを変更する権限がない場合、または変更したくない場合は、環境変数を設定してタイムゾーンを上書きできます。

一時的に有効(現在のシェルセッションのみ):

# 現在のシェルセッションでのみ有効
export CURRENT_TZ=Asia/Shanghai
date

永続的に有効(シェルの設定ファイルに追加):

Dockerfile内では通常 `ENV TZ=Asia/Shanghai` を使用し、開発環境では `.bashrc` または `.zshrc` に追加します。

# 永続的な設定 (例: シェルの設定ファイル)
echo "export PERMANENT_TZ=Asia/Shanghai" >> ~/.bashrc
source ~/.bashrc

タグ: linux Docker DevOps トラブルシューティング GitHub Codespaces

6月25日 23:30 投稿