docker-composeで作ったシステムをsystemd管轄下に置く

日々徒然

私はずっと大昔はKubernetesなんかを使っていたころもあったんですけど、今、実は docker-compose ぐらいしか触っておりませんで、加えて今はDockerエンジンこそPodmanではありますが、使ってる Docker-compose-v2 はDockerネイティブ、その橋渡しは Docker-wrapper を使っているという状況下であります。

さらに、開発している関係上起動停止の回数も多く、そのたびに上げて下げてするのもしんどいなぁということで、今回systemd管理に置いてみることに。以下のようにするとよいようです。セクションごとに解説でもしていこうかと思います。

作ったserviceファイル(Langfuseを例に)

[Unit]
Description=Docker Compose Service for Langfuse
After=podman.socket
Requires=podman.socket

[Service]
Type=simple
Environment="DOCKER_COMPOSE_PROJECT=langfuse"
Environment="PATH=/usr/local/bin:/usr/bin"
Environment="DCK_CMPS_PATH=/home/aiuser/langfuse"
WorkingDirectory=/home/aiuser/langfuse
ExecStart=/usr/bin/docker compose  -f ${DCK_CMPS_PATH}/docker-compose.yml up
ExecStop=/usr/bin/docker compose -f ${DCK_CMPS_PATH}/docker-compose.yml down
StandardOutput=append:/var/log/dck-services/dck-langfuse-stdout.log
StandardError=append:/var/log/dck-services/dck-langfuse-stderr.log
Restart=on-failure

[Install]
WantedBy=multi-user.target
~

Unitセクション

Unitセクションで大事になってくるのはAfter/Requires変数です。
サービスの依存関係を組むうえで必要になるのですが、DockerではなくPodmanを使っているため、ここではPodmanがAPI用に開放しているソケットを対象に設定します。これは、Podmanがサービスとして動作しないことが理由です。

Serviceセクション

今回、docker compose コマンドをフォアグラウンドサービスとして設定し、これを監視する SimpleType なサービスとして構成することにしました。環境変数として最低限必要なのは DCK_CMPS_PATH です。これは docker-compose.yaml が存在するパスを指定します。こうすることで、docker-compose.yaml へのパスを共通化させて、使いまわしやすくする構成にします。

docker-compose.yaml では、相対パスでボリュームの紐付けを記述することが多いですが、そのあたりはどうやら Docker Compose 側がYAMLファイルへのパスを参考にしてそのパスの調整をしてくれるようです。とはいえ、一部サービスでは docker-compose.yaml ファイルと実行する際のパスで違う指定をすることがありますので、「実行する際のパス」を WorkingDirectory 変数に指定することによりこれを補います。

再起動処理はOOM-Killerなどによって何らかの障害が発生した場合に再起動をするスタイル(on-failure)をとります。

ログは docker compose コマンドをフォアグラウンドで実行するため、標準出力やエラー出力に出されることになります。それをログファイルとして取得するため、Append形式でログ記録設定を追加しています。

Installセクション

Installセクションでは、どのランレベルで起動・停止制御をするか指定するのですが、これはもう当たり前のものとしてマルチユーザモードをそのターゲットに設定します。このセクションを加えることで、サービスの enable/disable 設定が行えるようになります。

コメント

タイトルとURLをコピーしました