Armadilloフォーラム

podman runが失敗する場合がある

tatsugami

2022年7月27日 14時06分

開発中のシステムで、Armadillo起動時に複数のコンテナを実行開始しておりますが、
稀に、コンテナの実行開始に失敗することがあります
何か情報がありましたらご教示いただきたく、よろしくお願いいたします

まず、起動スクリプトから抜粋すると概ねこんな感じです
podman rm -f
RUN_RESULT=`podman run -itd --name= \
--pod=xxx_pod \
--device=/dev/i2c-3 \
--volume=/var/app/volumes/xxx:/xxx \
--ipc=host \
/usr/local/apl/startup.sh`
echo "@@@ podman run result=$RUN_RESULT" >> ログファイル

通常は普通に起動できているのですが、時々起動できない場合があり以下のようになります
・上記スクリプト中からのRUN_RESULTの出力
 起動OK時:コンテナIDのハッシュ文字列が出力されている
 起動NG時:空っぽ(何も出力されない)
・podman ps -a
 起動OK時:該当コンテナはRunning状態
 起動NG時:該当コンテナはCreated状態(Startできていない)

起動NGが発生した場合、手動で「podman start コンテナID」を実行して、コンテナを開始することはできましたが、
その場合、コンテナ内の頭の方の処理でerrno=24 (too many open files)が発生しました
しかし、そもそもコンテナ起動NG再現時はコンテナ開始に至っていないのでコンテナ内部の問題とは考えられず、
コンテナ内で意図的に開くファイル数も数ファイル程度です
なお、試しにオープンファイル上限について、前述のコンテナ開始スクリプトで以下対応をした場合も改善しませんでした
・podmanを実行する前にulimit -n 8192を実行
・podman runのオプションに--ulimit nofile=8192:8192を追加

こちらでのコンテナ起動NGの再現率は、Armadilloのrebootを繰り返して、
多い時で10回に1回、少ない時で100回に1回程度と安定していませんが、一応再現はしています

コメント

> podman rm -f
上記のところ、正しく記載できていませんでしたので訂正いたします
実際には以下のようになっております
cNum=`podman ps -a | grep -c ${containerName}`
if [ ${cNum} -eq 1 ]; then
#存在する場合は、podman rmコマンドで一度コンテナを削除する
podman rm -f ${containerName}
fi

at_dominique.m…

2022年7月27日 14時31分

tatsugamiさん

お世話になっています、
アットマークテクノのマルティネです。

いくつか質問があります:

* Armadillo Base OS のバージョンは何でしょうか?先月のアップデートで podman 4 にアップグレードしたので、何かの問題が解決された可能性が高いです。/etc/atmark-release で確認できます。
* 起動スクリプトは何のスクリプトでしょうか? (/etc/local.d か本格的なサービスか…)
* NG の場合の 「podman ps -a」 の出力をお願いします。(Created は 「podman create」以外でみたことないので、お手数ですが何か情報があるかを確認したいです)
* 再現できるのであれば、podman run の stderr も取って表示してもらえたら手がかりがあると思います。以下のように取得できます。

RUN_RESULT=$(podman run .... /usr/local/apl/startup.sh 2>&1)

ちなみに、podman_start ( /etc/init.d/podman-atmark, /etc/atmark/containers/*.conf) を使ってない理由がありますか?
最新のバージョンで podman_start を最初に実行する時に podman のネットワークを作り直しています(dnsサービスを有効にするため)、そこでまた引っかかるかもしれません…試しに 「persist_file -vd /etc/runlevels/default/podman-atmark」でサービスを無効にしてみてください。(localのサービスは 「after *」でコンフリクトしないはずですが、他の手段で起動していたらの話です)

よろしくお願いします

> * Armadillo Base OS のバージョンは何でしょうか?先月のアップデートで podman 4 にアップグレードしたので、何かの問題が解決された可能性が高いです。/etc/atmark-release で確認できます。

3.15.3-at.4 でした

> * 起動スクリプトは何のスクリプトでしょうか? (/etc/local.d か本格的なサービスか…)

/etc/local.dからのスクリプトが起点です
そこから実行されるスクリプトから、更に子のスクリプトが実行され、最終的に問題のpodman runが実行されています

> * NG の場合の 「podman ps -a」 の出力をお願いします。(Created は 「podman create」以外でみたことないので、お手数ですが何か情報があるかを確認したいです)
> * 再現できるのであれば、podman run の stderr も取って表示してもらえたら手がかりがあると思います。以下のように取得できます。
>

> RUN_RESULT=$(podman run .... /usr/local/apl/startup.sh 2>&1)
> 

採取予定です
すぐに再現しないこともありますので、送付まで数日かかるかもしれません

> ちなみに、podman_start ( /etc/init.d/podman-atmark, /etc/atmark/containers/*.conf) を使ってない理由がありますか?
> 最新のバージョンで podman_start を最初に実行する時に podman のネットワークを作り直しています(dnsサービスを有効にするため)、そこでまた引っかかるかもしれません…試しに 「persist_file -vd /etc/runlevels/default/podman-atmark」でサービスを無効にしてみてください。(localのサービスは 「after *」でコンフリクトしないはずですが、他の手段で起動していたらの話です)

情報提供ありがとうございます
現在の製品開発への適用は困難な可能性が高いのですが、検討いたします

at_dominique.m…

2022年7月28日 8時53分

tatsugamiさん

> > * Armadillo Base OS のバージョンは何でしょうか?先月のアップデートで podman 4 にアップグレードしたので、何かの問題が解決された可能性が高いです。/etc/atmark-release で確認できます。
>
> 3.15.3-at.4 でした

具体的な不具合があるわけではありませんが、Armadillo Base OS が若い distribution なのでアップグレードでいくつかの改善があります(コンテナの「readonly」扱いヘルパーや複製用のインストーラー作成など)
よろしければそこに説明した手順でアップデートしてみてください
https://armadillo.atmark-techno.com/forum/armadillo/12331#comment-11374

> > * 再現できるのであれば、podman run の stderr も取って表示してもらえたら手がかりがあると思います。以下のように取得できます。
> >

> > RUN_RESULT=$(podman run .... /usr/local/apl/startup.sh 2>&1)
> > 

>
> 採取予定です
> すぐに再現しないこともありますので、送付まで数日かかるかもしれません

ログを取得したらまた連絡ください。
こちらで改善できる問題であれば何でも直します。

> > ちなみに、podman_start ( /etc/init.d/podman-atmark, /etc/atmark/containers/*.conf) を使ってない理由がありますか?
> > 最新のバージョンで podman_start を最初に実行する時に podman のネットワークを作り直しています(dnsサービスを有効にするため)、そこでまた引っかかるかもしれません…試しに 「persist_file -vd /etc/runlevels/default/podman-atmark」でサービスを無効にしてみてください。(localのサービスは 「after *」でコンフリクトしないはずですが、他の手段で起動していたらの話です)
>
> 情報提供ありがとうございます
> 現在の製品開発への適用は困難な可能性が高いのですが、検討いたします

/etc/local.d のスクリプトから実行されていたら問題ないです、podman-atmarkを有効させたままでも平行には実行されることはないですのでデフォルトのままでいいです。

ロカールのスクリプトをサポートしなくなることはないので一番便利な方法を使ってください。

よろしくお願いします。

> RUN_RESULT=`podman run -itd --name= \
> --pod=xxx_pod \

こちらも訂正です。実際には以下のようになっております
PODMAN_RESULT=`podman run -itd --name=${containerName} \
--privileged \
${containerOption_pod} \
${containerOption_device} \
${containerOption_volume} \
${containerOption_volume2} \
${containerOption_volume3} \
${containerOption_volume4} \
${containerOption_volume5} \
${containerOpiton_ipc} \
${containerImageName}${version} ${containerOption_command}`