Armadilloフォーラム

コンテナ内でrsyslogサーバーを構築する方法

rikuya-h

2025年1月27日 14時00分

お世話になっております。
長谷部と申します。

現在Armadillo-IoT G4を用いて
ある機器からsyslogデータを受信してデータ加工をpythonで行いたく考えております。
コンテナへapt-get installで rsyslog と systemctl をインストールし手動で立ち上げ、動作確認まで出来ましたが...

コンテナ起動時におけるrsyslogサーバーの"自動起動"が上手くいきません。

どの様に設定すれば良いでしょうか?

コメント

at_dominique.m…

2025年1月27日 14時42分

長谷部さん

お世話になっています、
マルティネです。

> ある機器からsyslogデータを受信してデータ加工をpythonで行いたく考えております。
> コンテナへapt-get installで rsyslog と systemctl をインストールし手動で立ち上げ、動作確認まで出来ましたが...

コンテナの実行コマンドを systemd にすることで、systemctl 等でコンテナ内にサービスを制御することは可能ですが、一般的なコンテナでは systemd を利用することは少ないのでおそらく systemd を起動してないことで rsyslog も起動していないかと思います。

本当に systemd で rsyslog を起動したい場合は、コンテナのコンフィグファイルの「set_command」を現状のコマンドから /lib/systemd/systemd へ変更すると systemd が立ち上がって systemctl で制御できるようになるかと思います。

また、他の方法としては:
* systemd を利用しなくてもコンテナの起動スクリプトで rsyslog を手動に起動すれば起動はできます。
* syslog の受信はシンプルな udp socket でパッケットを受信するだけですので、処理内容によっては python プロセスから socket を立ち上げて直接に bind/recvmsg を実装した方が早いかもしれません。

よろしくお願いします

ご返信ありがとうございます。
> また、他の方法としては:
> * systemd を利用しなくてもコンテナの起動スクリプトで rsyslog を手動に起動すれば起動はできます。
こちらが指している起動スクリプトとはpythonプロジェクト作成時に生成される。python_lunchスクリプトの事でしょうか?
現在、pythonファイル(while文)を実行させていますので
python実行継続のままrsyslog起動も加えたく考えています。
ご教授頂けると助かります。

at_dominique.m…

2025年1月27日 18時31分

マルティネです。

> > * systemd を利用しなくてもコンテナの起動スクリプトで rsyslog を手動に起動すれば起動はできます。
>
> こちらが指している起動スクリプトとはpythonプロジェクト作成時に生成される。python_lunchスクリプトの事でしょうか?

はい、rsyslogd コマンドはデフォルトでバックグラウンドに実行されますので、
python_launch スクリプトの python3 実行前に「rsyslogd」だけを追加すれば利用できるかと思います。

よろしくお願いします。

長谷部です。
> はい、rsyslogd コマンドはデフォルトでバックグラウンドに実行されますので、
> python_launch スクリプトの python3 実行前に「rsyslogd」だけを追加すれば利用できるかと思います。
ありがとうございます。
試してみます。

因みにですが、python_launchへバッググラウンド実行されないコマンドの末尾に & を追加してバックグラウンド実行させようとして
記述しコンテナ起動させるとエラーが起きるのですが
対処法はありますでしょうか?

at_dominique.m…

2025年1月28日 11時28分

長谷部さん、

マルティネです。

> 因みにですが、python_launchへバッググラウンド実行されないコマンドの末尾に & を追加してバックグラウンド実行させようとして
> 記述しコンテナ起動させるとエラーが起きるのですが
> 対処法はありますでしょうか?

こちらについては心当たりありません。
python_launch は普通のシェルスクリプトですので & も利用可能です。

何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。

よろしくお願いします。

事象回復しないためご教授頂けると助かります。
> 何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
> 解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。

python_launchファイルへ以下を追記

python3 /vol_app/src/main.py &
echo 'test'

コンテナを再起動すると...

armadillo:/var/app/rollback/volumes/python/src# podman exec -it app bash
Error: can only create exec sessions on running containers: container state improper

podman ps -a

1f4499079c22 localhost/python:latest python_launch 3 hours ago Exited (0) About a minute ago 0.0.0.0:3000->3000/tcp,,(省略) app

の様な状態となりコンテナが停止してしまいます。

at_satoshi.ohta

2025年1月28日 18時53分

横から失礼いたします、太田です。
1点確認させてください。

> python_launchファイルへ以下を追記

こちらArmadillo上でpodman execコマンドを用いてコンテナに入ってpython_launchファイルを修正したということでしょうか?

もしそうであれば、上記の方法ではなく、
ATDE上にあるpython_launchファイルを修正していただけますでしょうか?
python_launchはデフォルトではコンテナイメージに含まれているため、&を反映させるためにはコンテナイメージ自体を更新する必要があると思われます。
ATDE上のpython_launchファイルは、最新のpythonプロジェクトでは以下のパスにあるはずです。

<作成したpythonのプロジェクトディレクトリ>/containers/resources_python/bin/python_launch

このファイルを修正したのち、[Generate development swu]もしくは[Generate release swu]を実行して、
生成されたSWUイメージ(development.swuまたはrelease.swu)をArmadilloにインストールしてください。
その後、コンテナの挙動をもう一度確かめてみていただいてもよろしいでしょうか?

よろしくお願いいたします。

アットマークテクノの古賀です。

以下の振る舞いは、podman の仕様と、コンテナ動作の仕様の組み合わせによるものです。

長谷部さん:
>事象回復しないためご教授頂けると助かります。
>>何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
>>解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。
>
>python_launchファイルへ以下を追記

python3 /vol_app/src/main.py &
echo 'test'

>
>コンテナを再起動すると...

armadillo:/var/app/rollback/volumes/python/src# podman exec -it app bash
Error: can only create exec sessions on running containers: container state improper

>podman ps -a

1f4499079c22  localhost/python:latest                  python_launch         3 hours ago  Exited (0) About a minute ago  0.0.0.0:3000->3000/tcp,,(省略)  app

>の様な状態となりコンテナが停止してしまいます。

以下、この振る舞いについての説明です。
まず、podman の exec サブコマンドは、Docker の場合と違い、終了状態(Exited)のコンテナに対して実行できません。
 https://docs.podman.io/en/v1.6.4/markdown/podman-exec.1.html
 https://github.com/containers/podman/issues/3020
つまり、python_launch に記載したコマンド列を実行対象としてコンテナを起動した後、podman exec を実行した時に以下のエラーとなるのは、その時点でコンテナが実行終了しているからなのです:

 Error: can only create exec sessions on running containers: container state improper

記載いただいた python_launch では、main.py を実行する python3 コマンドをバックグラウンド実行開始した後、echo コマンドを実行しますが、echo コマンドが実行終了するとコンテナが動作終了するのです。
冒頭で述べたように、これはコンテナ動作の仕様です。

コンテナエンジンがコンテナを実行する際、実行コマンドとして指定されたプログラムの実行が終了すると、そのプログラムから起動されたバックグラウンドプロセスが動作中であっても、コンテナは動作終了します。
たとえば、stackoverflow に寄せられた "Docker exit after starting a command which goes into background. Then how can we take benifit of that service" という質問に対するコメントを見てみてください:
 https://stackoverflow.com/a/54991182

記載頂いたエラーを回避するには、このコメントで述べられているように、フォアグラウンドで実行するコマンドが、バックグラウンド実行するプログラムが終了する前に終了してしまわないようにしないといけません。
たとえば、 sleep infinity ですとか、上の stackoverflow のコメントにある tail -f /dev/null など、実行終了しないコマンドを末尾に記載するのがお手軽でしょう。
あるいは、バックグランド実行するプログラムが一つだけであれば、コメントで紹介されている Docker のドキュメントの例のように、wait -n で実行終了を待つ、というやり方もあるでしょう:
 https://docs.docker.com/engine/containers/multi-service_container/#use-…

# ちなみに、このドキュメントの例では、二つのプログラムをバックグランド実行していますので、どちらか一方が終了するとコンテナが実行終了します。

以上、参考になりましたら幸いです。

ご回答ありがとうございます。
> 記載いただいた python_launch では、main.py を実行する python3 コマンドをバックグラウンド実行開始した後、echo コマンドを実行しますが、echo コマンドが実行終了するとコンテナが動作終了するのです。
> 冒頭で述べたように、これはコンテナ動作の仕様です。
>
> コンテナエンジンがコンテナを実行する際、実行コマンドとして指定されたプログラムの実行が終了すると、そのプログラムから起動されたバックグラウンドプロセスが動作中であっても、コンテナは動作終了します。
こちら失念しておりました。
丁寧な回答ありがとうございました。
頂いた内容で開発を進めさせて頂きます。