...
Info |
---|
既存のAdamApp、AzureIoT用のContainer AdamApp及びext版のContainer AdamAppのそれぞれどれを選択すべきかについては、 |
ext形式Container AdamAppは、コンテナの構成をDocker composeの設定ファイル (docker-compose.yaml) で指定することが可能です。docker-compose.yamlファイルでは、サービス名を複数記載することで、複数のコンテナを起動できます。
以下に従来にAdamAppとContainer AdamAppの構成の違いの概念図を示します。
Drawio | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
既存のコンテナをi-PROカメラで動作させたい場合、docker_multi_imagesイメージをカメラからの管理用として新たに追加することで、既存コンテナは少ない変更量でカメラ上で動作させることができます。
Drawio | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
2.3.1 RAM / ROM / CPUリソース について
新Xシリーズカメラが機能拡張アプリケーションで使用できるリソースは CV52カメラが機能拡張アプリケーションで使用できるリソースは i-PROカメラへのソフトウェアインストール条件 - チュートリアル・FAQ - Development Partner Portal をご参照ください。
移植対象のアプリがこの制限内で動作できることをご確認ください。
RAM/CPUの制限はcgroupsによって行われています。RAM使用量が制限値を超えた場合、OOM Killerによってアプリが強制終了します。
2.3.2 データのストレージについて
ボリュームをマウントすることで、カメラ内部のフラッシュメモリへデータの書き込みを行うことができます。ただし、フラッシュメモリには書き込み回数に上限があるため、頻繁にデータの書き込みを行う場合は、SDカードを活用ください。
SDカードにデータベースSQliteを構築するとも可能です。サンプルアプリsqlite_appで実装されています。
2.3.3 セキュリティポリシーについて
Container AdamAppに関するセキュリティポリシーの詳細は アプリの開発と動作確認方法(Container Adamapp編) - チュートリアル・FAQ - Development Partner Portal (i-pro.com) をご覧ください。
...
コンテナはroot権限で動作させることはできません。
カメラ内ではuid 1000、gid 1000のユーザー権限でアプリが動作します。コンテナはread onlyでマウントされます。
コンテナ内に書き込みを行うことはできません。既存のアプリがコンテナ内に書き込みを行っている場合、一時的なデータであればtmpfs、永続的なデータであればボリュームを別途マウントし、そちらに書き込む必要があります。--previledgedなどのセキュリティを緩和するオプションは使用できません。
カメラ内から直接外部のコンテナレジストリよりイメージをpullすることはできません。必要なイメージは開発用PC上でpull、ビルドし、extファイル内に含まれる必要があります。
Info |
---|
コンテナ内がread onlyでマウントされることによるデータディレクトリの影響について ADAM APIでは、フラッシュROM上のdataディレクトリのパスを返却するAPIとして、ADAM_GetAppDataDirPath が用意されていますが、Container AdamAppの場合、このディレクトリは読み取り専用となり、書き込むことができません。データの書き込みを行いたい場合はボリュームをご使用ください。 |
2.3.4 ADAM APIの使用制限
2.3.4.1 ADAM
...
APIを使用することのできるコンテナ
Container AdamAppに複数のコンテナが含まれている場合、ADAM APIが使用できるコンテナはメインコンテナのみとなり、サブコンテナからは使用できません。
カメラの機能を使用したい場合は、メインイメージ内に実装し、カメラに依存しない汎用的な機能をそのままカメラ上で動かしたい場合はサブイメージ内に実装することをお勧めします。
メインイメージ・サブイメージ間のデータ共有は、3.4章で説明します。
2.3.4.2 ADAM APIで取得できるディレクトリパス
AdamApp、Container AdamAPp、Container AdamApp for Azure IoTで取得できる各種ディレクトリパスは下表のようになります。 2.3.3でも言及しましたが、Container AdamAppにおいて、ADAM_GetAppTmpDirPathで取得できるパスは読み取り専用領域となります。
また、ADAM_GetAppTmpDirPathで取得できるディレクトリはホスト側(カメラ本体)と共有されますので、ホスト側からアクセスされたくないデータを一時保管する際はdocker-compose.yamlのtmpfsセクションで定義した領域をご使用ください。
| AdamApp | Container AdamApp | Container AdamApp for Azure IoT |
---|---|---|---|
ADAM_GetAppTmpDirPath | /dev/shm/Adamapp/[アプリ固有ID] | /dev/shm/Adamapp/[アプリ固有ID] | /tmp/local/appdata |
ADAM_GetAppDataDirPath | /app/data | /app/data | /ai_data |
3.開発手順
3.1 プロジェクトの作成
プロジェクトディレクトリの準備
...
アプリバージョン名
カメラブラウザの管理画面上に表示されるバージョン情報となります。メインイメージのタグ名と合わせるとわかりやすいです。アプリ名
カメラブラウザの管理画面上に表示されるアプリ名となります。各言語で記述することが可能です。リソース関連情報
アプリが使用するROM/RAM/CPU使用率 (申告値)を記載します。インストール時に他のアプリで申告された値の合計が制限を超えていないかチェックするために使用されます。全アプリの申告値の合計が制限を超える場合、アプリはインストールに失敗します。ライセンス関連情報
i開発開始時は初期値のまま使用ください。開発完了時、i-PROより割り当てられたFUNC IDを指定してください。PROへ連絡し、割り当てられたFUNC IDへ置き換えてください。
3.2 サブイメージ (移植対象イメージ) の準備
...
services キーの子レベルにサブイメージの情報を追加します。 サンプルアプリではすでに記載されていますのでその内容を説明します。
webサービスについての全体の記載は以下となります。
images:
ここには3.2で作成したイメージ名とタグを指定します。ここで指定したイメージが存在しない場合、アプリのビルドスクリプトは失敗します。networks:
コンテナ間で通信したい場合、同じネットワークを指定する必要があります。restart:
コンテナが終了したときにどのように復旧するかを指定します。ext形式Dockerの場合、メインコンテナはDockerの仕組みを使用せずにカメラファームウェアによって監視されるため、noを指定することで、適切に再起動します。一方サブコンテナはカメラファームウェアから監視されませんので、実動作に合わせて設定します。ports:
サブイメージが外部から接続できるポートを公開する場合、[カメラ側]:[コンテナ側]の書式で記載します。volumes:
ボリューム、バインドマウントを記載します。
ボリュームは、サービス名(コンテナ名)と同名のボリューム名のもののみ作成できます。匿名ボリュームは作成できません。
メインコンテナの場合、ボリュームの”target”は “/ai_data” を指定する必要があります。サブコンテナにはこの制限はありません。
ここに定義されているボリューム名は別途yamlファイルトップのvolumes: セクションにも記載する必要があります。
バインドマウントできるディレクトリパスには制限があります。
カメラ内部のフラッシュメモリへデータの書き込みが行われます。フラッシュメモリには書き込み回数に上限があるため、頻繁にデータの書き込みを行う場合は、tmpfsまたはSDカードを活用ください。tmpfs:
セキュリティポリシーによりコンテナ内には書き込めないため、/var以下などのアプリが一時的に保存するディレクトリがある場合はここに指定します。
nginxの場合、 /var/cache/nginx、/var/run 以下に書き込みますので、これらをtmpfs として指定しています。
カメラ内部のRAMへデータの書き込みが行われます。必須のパラメータ
以下パラメータはi-RPOカメラのセキュリティポリシーを満たすために付与が必要です。 このままコピー&ペーストしてください。Code Block read_only: true user: 1000:1000 cap_drop: - "net_raw" security_opt: - "label=type:ipro-container.process" - "no-new-privileges" labels: com.i-pro.app-type: "ext" com.i-pro.device-category: "CV5x-A" com.i-pro.device-vendor: "i-PRO"
ルートレベルのvolumesの記載
yamlファイルのルート (トップ) 以下のvolumes: セクションに、ボリューム名を記載します。
...
volumeを使用する。
docker-compose.yamlに記載することでvolumeをコンテナ間で共有することができますのでこの中でデータをやり取りできます。ただしこの領域はFlashROM上となり、寿命に影響がありますので大量なデータのやり取りには向きません。yamlに記載することでvolumeをコンテナ間で共有することができますのでこの中でデータをやり取りできます。ただしこの領域はFlashROM上となり、寿命に影響がありますので高頻度のデータのやり取りには向きません。共有が許可されているtmpfsを使用する。
ADAM_GetTmpDirPath() APIで取得できる領域はtmpfs上にあり、一時的なデータ保存用として利用できます。
サブコンテナからこの領域にアクセスするためには、docker-compose.yamlのサブイメージの記述内のvolumes: に以下を追加します。Code Block - type: bind target: "/dev/shm/Adamapp" source: "/dev/shm/Adamapp" read_only: false consistency: default
ただし、サブコンテナからはADAM_GetTmpDirPath()を呼ぶことができませんので、別途volumeを使う方法などでメインコンテナからパスを通知する必要があります。
HTTP経由で取得する。
Dockerでは各コンテナに仮想のIPアドレスが割り当てられるため、こちらを利用して、カメラ外と同様にWebAPIを呼ぶことができます。また、docker-compose.yamlのhostnameキーでドメイン名を指定すると、この名前で通信を行うこともできます。
メインコンテナでは、ADAMの仕組みとして、sendDataToAdamApplication WEB APIを使用して通信を行うことができます。この仕組みはカメラ本体がメインコンテナにデータを仲介する方法ですので、あて先はカメラ本体のIPアドレスとなります。
また、同様にカメラのCGIを利用してカメラ本体の設定値などを取得することができます。
...