Armadilloフォーラム

コンテナからロールバックコマンドを実行したい

umeshi

2025年6月4日 11時42分

==========
製品型番:AGX4500-C00Z
Debian/ABOSバージョン:3.20.3-at.7
カーネルバージョン:5.10.224-0-at
3G/LTE モジュール情報 (Debianのみ):利用無し
その他:
==========

お世話になっております。
現在Armadillo-IoT G4の開発にて、Armadillo機器を複数台利用して開発を行っており、
弊社開発アプリのバージョンに問題があった場合に対応できるよう、開発アプリを前のバージョンに戻せないか調査しております。

実施したいこととしましては、コンテナから手動ロールバックを実行することです。
ABOSで「abos-ctrl rollback --allow-downgrade」と「reboot」を実行することでロールバックを確認できましたので、
今度はこのコマンドを弊社開発アプリ(コンテナ)から実行したいと考えております。

ご教授いただきたい点は、「abos-ctrl rollback --allow-downgrade」をコンテナから実行する方法についてです。
「reboot」はブログやマニュアルを参考に、RestAPIを利用してコンテナからの実行を確認できましたが、
「abos-ctrl rollback --allow-downgrade」も同様にRestAPIを介してコンテナから実行可能でしょうか。

なお、弊社開発アプリのバージョンはSWUバージョンと紐づけて管理しており、
新たにビルドして弊社開発アプリのバージョンを上げたくないと考えております。
ご教授いただければ幸いです。

コメント

at_dominique.m…

2025年6月4日 16時05分

umeshiさん

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

> 現在Armadillo-IoT G4の開発にて、Armadillo機器を複数台利用して開発を行っており、
> 弊社開発アプリのバージョンに問題があった場合に対応できるよう、開発アプリを前のバージョンに戻せないか調査しております。
>
> 実施したいこととしましては、コンテナから手動ロールバックを実行することです。
> ABOSで「abos-ctrl rollback --allow-downgrade」と「reboot」を実行することでロールバックを確認できましたので、
> 今度はこのコマンドを弊社開発アプリ(コンテナ)から実行したいと考えております。
>
> ご教授いただきたい点は、「abos-ctrl rollback --allow-downgrade」をコンテナから実行する方法についてです。
> 「reboot」はブログやマニュアルを参考に、RestAPIを利用してコンテナからの実行を確認できましたが、
> 「abos-ctrl rollback --allow-downgrade」も同様にRestAPIを介してコンテナから実行可能でしょうか。

そうですね、「6.9.6.17. Rest API : カスタムスクリプトの実行」 ( https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro… ) 通りに任意のスクリプトを追加すればロールバックも対応できます。
標準の REST API で大きいなソフトウェア変更をできないように設計していますので、ロールバックの様に古いバージョンに戻れるコマンドを追加しない予定です、カスタムスクリプトとしては問題ないかと思います。

ちなみに、「abos-ctrl rollback」と「reboot」の間に swupdate によるアップデート開始になれば不具合の可能性がありますので、「abos-ctrl rollback --reboot」オプションでロックを取って再起動も続いて実行されます(ロールバック不可能な場合はコマンドがエラーして再起動しませんので、--allow-downgrade は同じく必要です)

上記のカスタムスクリプトの REST API で問題ないと思いますが、「ABOSらしい」やり方も紹介させてください。
(すみません、ずっと前から howto か何かでまとめて公開したいと考えていますが、なかなか手をつけれず…)
コンテナの自己テスト機能を利用すると rollback もそのレベルで対応できると考えています。
コンテナのコンフィグファイルに set_healthcheck を設定すると、コンテナ内にコマンドが定期的に実行されて、テストが失敗した場合にコンテナをリスタートしたり rollback するなどの対応は可能です。
また、間違って古いバージョンに戻らないためにテストが成功した場合に「abos-ctrl rollback-clone」コマンドを実行して、その後にユーザーがロールバックを起こせたとしても古い(脆弱性があるかもしれない)バージョンに戻れなくなります。

設定方法は改めて動作確認してませんが、以下のコードをコンテナコンフィグに追加すれば意図通りに動くかと思います。

armadillo:~# cat /etc/atmark/containers/health_test.conf 
# コンテナイメージ、コマンド等を通常通りに設定します
set_image docker.io/alpine
set_command sleep infinity
 
# テストのため間隔を短くします。
# (デフォルトは --interval '1 min' --retries 3 ですのでかなり長いです)
# コンテナの失敗となって、「set_healthcheck_fail_command」で設定したコマンド
# とここでの --action 設定(デフォルトコンテナのりスタート)が実行されます。
# 
# ここではコンテナのアプリケーションでエラーがあった場合に /failed のファイルを作る想定ですが、
# `curl http://localhost/healthcheck` や他のアクティブチェックも可能です。
set_healthcheck --interval '3 sec' --retries 2 -- test ! -e /failed
 
# チェックが成功した場合に古いソフトウェアを上書きします(両面が同期されます)
# (アクティブチェックでないとまだ失敗してないだけの恐れがあって、危ないですね…)
set_healthcheck_start_command abos-ctrl rollback-clone
# 失敗の場合に rollback します。 --action rollback でもいいはずですが、
# 今のバージョンで --allow-downgrade が設定されてないのであまり意味がないです…
# (rollback-clone されたバージョンにしか切り替えれません)
# すみません、今後のアップデートで追加しますがひとまず任意コマンドでも対応できます。
set_healthcheck_fail_command abos-ctrl rollback --allow-downgrade --reboot

と、書いてるうちに、まだ荒いところは残ってますので改善の余地はありますが方法としてはこういうこともできます。

> なお、弊社開発アプリのバージョンはSWUバージョンと紐づけて管理しており、
> 新たにビルドして弊社開発アプリのバージョンを上げたくないと考えております。

バージョンを上げないとロールバックした後に「同じバージョンになるのでインストールできない」とエラーされますね。
手動でインストールする場合はメッセージ通りに SW_ALLOW_ROLLBACK の環境変数を設定すればインストールできますが、自動(USB、Armadillo Twin または ABOS Web でのインストール)の場合はできないので、どうしても上げたくない場合は上記の様に「abos-ctrl rollback-clone」等で B 面にあった失敗作を削除してからインストールするなどの対策が必要です。

# 余計なお世話ですが、個人的にはインストールされた恐れがある場合にバージョンを上げるべきだと思います。
# 問題のあるソフトをリリースした後に同じバージョンで修正を出すと、後で修正がちゃんとインストールされたことを確認したい時は問題のバージョンと区別できないのは困りますので。
# テストの段階で問題を発見して限られたところにしかインストールされる場合はどうにかなりますが、そういう自動な仕組みが絡まると危ないような気がします。

よろしくお願いします。