...
コンテナは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 プロジェクトの作成
プロジェクトディレクトリの準備
...
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を利用してカメラ本体の設定値などを取得することができます。
...