Armadilloフォーラム

コンテナの自動起動方法

abes_sh

2023年4月4日 13時31分

Armadilloの電源オンからコンテナを自動起動する方法についてですが、restart=always オプションでupdate もしくは runすることはpodmanで可能でしょうか。

コメント

at_dominique.m…

2023年4月4日 13時49分

abes_shさん

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

> Armadilloの電源オンからコンテナを自動起動する方法についてですが、restart=always オプションでupdate もしくは runすることはpodmanで可能でしょうか。

申し訳ございません、質問の意味がよく分かりませんでしたので、restart=alwaysオプションについて少し説明させていただきます。

/etc/atmark/containers のコンフィグファイルに set_restart always (最初のリリースの restart=always でも同じく使えつづけます)を設定すると、
podman_start の実行スクリプトで podman run ... --restart=always を設定するだけです。

このオプションを使う場合、コンテナが停止すると podman が自動的に再起動させますが、podman stop や podman kill のコマンドで外部からコンテナを停止する場合には再起動されません。
なので、swuファイルからのコンテナのアップデートは普通にできますし、podman_start hogehoge でコンテナを強制的に再起動させることもできます。

最後に、docker と違って Armadillo を再起動する場合にも restart=always が影響ありません。podman 自体はサービスではないので、Armadillo 以外でもそういう設計です。
Armadillo の電源オンからコンテナの自動起動は、起動時の /etc/atmark/containers/*.conf の処理です。restart=always でなくても、set_restart no を設定しない限りは起動されます。

これで少し返事になりましたか?
また何か不明なことがあれば、遠慮なく聞いてください。

よろしくお願いします。

abes_sh

2023年4月4日 14時16分

ありがとうございます。
全体の運用の理解ができてない状態での質問申し訳ありません。
まず、状況から説明ですが、
eMMC上にコンテナimageを保存、そこから、プログラムをインストールした状態のコンテナが存在するのですが、
電源オンから、podman start コマンドでコンテナを起動しているのですが、
電源オンから、そのコンテナを自動起動したいと思っており、その場合、 /etc/atmark/containers/*.conf の具体的な記述方法は
どうなりますでしょうか。

> abes_shさん
>
> お世話になっています、
> アットマークテクノのマルティネです。
>
> > Armadilloの電源オンからコンテナを自動起動する方法についてですが、restart=always オプションでupdate もしくは runすることはpodmanで可能でしょうか。
>
> 申し訳ございません、質問の意味がよく分かりませんでしたので、restart=alwaysオプションについて少し説明させていただきます。
>
> /etc/atmark/containers のコンフィグファイルに set_restart always (最初のリリースの restart=always でも同じく使えつづけます)を設定すると、
> podman_start の実行スクリプトで podman run ... --restart=always を設定するだけです。
>
> このオプションを使う場合、コンテナが停止すると podman が自動的に再起動させますが、podman stop や podman kill のコマンドで外部からコンテナを停止する場合には再起動されません。
> なので、swuファイルからのコンテナのアップデートは普通にできますし、podman_start hogehoge でコンテナを強制的に再起動させることもできます。
>
> 最後に、docker と違って Armadillo を再起動する場合にも restart=always が影響ありません。podman 自体はサービスではないので、Armadillo 以外でもそういう設計です。
> Armadillo の電源オンからコンテナの自動起動は、起動時の /etc/atmark/containers/*.conf の処理です。restart=always でなくても、set_restart no を設定しない限りは起動されます。
>
>
>
> これで少し返事になりましたか?
> また何か不明なことがあれば、遠慮なく聞いてください。
>
> よろしくお願いします。

at_dominique.m…

2023年4月4日 14時48分

abes_shさん、

マルティネです。

> 全体の運用の理解ができてない状態での質問申し訳ありません。

いいえいいえ、こちらこそコンテナの起動の仕組みが分かりにくくてすみません。

> まず、状況から説明ですが、
> eMMC上にコンテナimageを保存、そこから、プログラムをインストールした状態のコンテナが存在するのですが、
> 電源オンから、podman start コマンドでコンテナを起動しているのですが、
> 電源オンから、そのコンテナを自動起動したいと思っており、その場合、 /etc/atmark/containers/*.conf の具体的な記述方法は
> どうなりますでしょうか。

なるほど、ちゃんと理解したことを確認するために、現状を言い直しますと:
* abos-ctrl podman-storage --disk (か podman_switch_storage) で podman のストレージを eMMC に切り替えています;
* podman run/create で一度手動でコンテナを起動しました;
* Armadillo を再起動する後に、同じコンテナを podman start で起動しないと起動されません。

これであっていますね?

最初の返事の通り、podman run/create の --restart=always オプションは再起動まで影響はできてないので、残念ながら正常です。

( ちなみに、podman ストレージを eMMC にしたままで運用してもよければ、 /etc/local.d/container.start に podman start コマンドを実行するだけでもいいかもしれませんが、コンテナの更新は難しいですし、podman の不具合でコンテナの更新中に電源が落ちたら起動できなくなる場合もありますので運用は --tmpfs の状態に戻すことをおすすめします。)

podman_start の紹介の前、その名前が少し紛らわしいことで podman start を使っていません。ストレージが eMMC でも tmpfs でも podman run で新しいコンテナを作りますので、未保存のデーターがあれば podman commit で保存してください。
また、運用の時にデーターを維持したい場合はボリュームを使ってください。

podman_start で使っているコマンドは、/etc/atmark/containers/<container>.conf の設定ファイルを読んで、 podman run コマンドを作っています。例えば、以下のコンフィグで「at-debian-image」のコンテナを起動して、weston をスタートします:

 set_image localhost/at-debian-image:latest
 
# for VPU and NPU
add_volumes /opt/firmware:/opt/firmware:ro
add_devices /dev/dri /dev/galcore
 
# for video decoding
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e /dev/ion
 
# for weston
add_volumes /run/udev:/run/udev:ro
add_devices /dev/input /dev/tty7
add_args --cap-add=SYS_TTY_CONFIG
 
# for weston with external clients
add_volumes /tmp/xdg_home:/run/xdg_home
add_args --env=XDG_RUNTIME_DIR=/run/xdg_home
 
# replace with a more useful command
set_command weston --tty=7

podman_start の細かいオプションの説明は製品マニュアルにあります:
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

/etc/atmark/containers にコンフィグを設置して、persist_file で保存したら起動の際にそのコンテナが起動されます。
また、podman_start -v <container> で試し起動もでき、 podman run のコマンドも表示されます。

これで何とか起動できると思いますが、また何か不明な点があればまた聞いてください。

よろしくおねがいします。

abes_sh

2023年4月4日 15時58分

丁寧な回答いただきありがとうございます。
> これであっていますね?
その手順の通りで大丈夫です。

コンテナは--tmpfsメモリ上に保存して、電源オンの度にイメージからコンテナ作成?起動されるような運用が推奨と理解いたしました。
/etc/atmark/containers/*.conf の記述がset_imageから始まっているので、imageからでなく、
既に作成済みのコンテナから自動起動する方法があればと思い、質問してしまいました。

プログラムインストール済みのコンテナを改めてimage化して、--tmpfs(メモリ)にコンテナの保存先を変更、
ボリューム設定含めて確認してみようと思います。
回答ありがとうございました。

at_dominique.m…

2023年4月4日 16時33分

abes_shさん

> コンテナは--tmpfsメモリ上に保存して、電源オンの度にイメージからコンテナ作成?起動されるような運用が推奨と理解いたしました。

すみません、これも説明不足でした。

abos-ctrl podman-storage --tmpfs (デフォルト)状態でも、コンテナイメージはちゃんと eMMC に保存できますが、コンテナの一時的なデーターは tmpfs になります。
この状態ではイメージが読み取り専用になっていて、編集するには SWU でコンテナイメージを送信するか、abos-ctrl podman-rwのコマンドで一時的にイメージ領域を書き込み可能にするか、abos-ctrl podman-storage --tmpfs で現状のコンテナ(eMMCまたはメモリ上)を読み取り専用のストレージに同期させることができます。

やり方が色々あって詳しい説明したら長くなりますが、とりあえず今の状態から abos-ctrl podman-storage --tmpfs で一時的なストレージに切り替えてもイメージが消えるわけではありません。

(起動する度にビルドさせるのは、時間とネットワークも必要ですのでおすすめしません)

podman_start自体はストレージと関係なく同じ使い方はできますので、開発が終わるまでに podman-storage --diskでもいいと思います。

podman_start を使えば、podman-storage --tmpfs での差はこの2点だけです:
* 起動されたコンテナの一時データーはメモリになりますので、コンテナ内に書き込みが多ければメモリを消費します。
* podman commitやビルドを普通に使った場合は同じくメモリ上に保存されますので、追加コマンドで eMMC に移ることが必要ですし、容量がメモリに制限されて小さいです。この点で podman-storage --disk を開発の時におすすめしています。

> /etc/atmark/containers/*.conf の記述がset_imageから始まっているので、imageからでなく、
> 既に作成済みのコンテナから自動起動する方法があればと思い、質問してしまいました。

すみません、podman としてはすでに作成されたコンテナの編集はさせませんので、一度作成されたコンテナはとても扱いにくいです。

イメージを更新しても同じオプションでコンテナを更新できませんですし、オプションを一つ追加することもできませんので、あえてこういうコンテナを扱わないことにしました。

> プログラムインストール済みのコンテナを改めてimage化して、--tmpfs(メモリ)にコンテナの保存先を変更、
> ボリューム設定含めて確認してみようと思います。

そこはあっていますね。ご自分のアプリケーションをイメージに追加して、イメージを podman commit か podman build で固まってから podman_start でイメージの状態から起動させます。
データーベースやログを残したい場合はボリュームを指定することで eMMC に書きます。

abes_sh

2023年4月4日 18時42分

説明ありがとうございます。理解が追い付いていない
まだ、テスト的にデータ送信ができた段階ですので、当面は、podman-storage --disk(eMMC)のままで、
アプリを含むコンテナを再イメージ化(podman commit)して、 podman_start での自動起動にチャレンジしてみようと思います。
(コンテナ内のアプリのログ出力フォルダをボリューム設定することも含めて。)
まだ、理解が追い付いていないところもあり、また質問するかもしれませんが、その際は、よろしくお願いします。
ありがとうございました。