ブログ

Armadillo-IoT G4:コンテナでの開発を簡単にする方法

at_shinya.matsumoto
2022年4月1日 14時57分

本ブログはArmadillo-IoT G4(以下、G4)でコンテナ開発を行う際に知っておくと便利な方法をご紹介します。
G4でのコンテナ開発に慣れていない方向けの内容になります。

はじめに

Armadillo-IoT G4はeMMC(ストレージ)への書き込みを最小限にする観点から、tmpfs(メモリ上に作成する
ファイルシステム)に保存する設定にしております。メモリ上のファイルは電源を一度落とすと消えてしまう為、
開発時はeMMCへ書き込む様に下記の様に設定を変更します。

ファイルをeMMCへ保存に変更するコマンド
# podman_switch_storage --disk
 
ファイルをtmpfs(メモリ)へ保存に変更するコマンド
# podman_switch_storage --tmpfs
 
ファイルの保存先設定を確認するコマンド(下記はeMMCへ保存する設定)
# podman_switch_storage --status
Currently in disk mode, run with --tmpfs to switch

以下、eMMCへ保存する事を前提で記載致します。

目次

1.コンテナでのアプリ開発のメリットとデメリット
2.簡単なコンテナイメージの作成方法
3.簡単なコンテナの作成方法
4.その他情報

1.コンテナでのアプリ開発のメリットとデメリット

コンテナでのアプリ開発において、従来のユーザーランドに直接開発する方法と比較して
大きく異なる点は下記と考えられます。

コンテナ化する事のメリット
 ・セキュリティの向上
  →各デバイスやディレクトリ、ポート、他のコンテナへのアクセスを制限
   脆弱性の限定

 ・コンテナ単位での開発やアップデートが可能
  →コンテナ毎でOS,パッケージ等の制限が無い為、独立して開発が可能
   対象のコンテナだけをアップデート可能

コンテナ化する事のデメリット
 ・適度にイメージを新規に作成する必要がある
  →コンテナはレイヤー構造になっており、アップグレードを重ねる毎にサイズが増えていく
 ・アクセス権限の設定の手間が増える
 ・アクセス権限の変更の度にコンテナを作り替える手間が増える

そこで、上記デメリットと感じる作業を効率化する方法をそれぞれご説明します。
 ・適度にイメージを新規に作成する必要がある
  →2.簡単なコンテナイメージの作成方法 で説明します。

 ・アクセス権限の設定の手間が増える
 ・アクセス権限の変更の度にコンテナを作り替える手間が増える
  →3.簡単なコンテナの作成方法 で説明します。

2.簡単なコンテナイメージの作成方法

コンテナイメージを作成する方法は下記2種類あります。(外部からロードする場合を除く)
 ①Dockerfileでイメージを作成      ・・・一からイメージを作る場合に推奨
 ②コンテナからイメージファイルを作成 ・・・開発時、軽度のバージョンアップ時に推奨

①Dockerfileでイメージを作成

Dockerfileを使う事で必要なパッケージやファイル等を組み込んだコンテナイメージを作成する事が
出来ます。以下の例以外にも様々な設定が可能です。
(Dockerfile書式:https://docs.docker.com/engine/reference/builder/)

以下はDockerfileでコピーするディレクトリとインストールパッケージの簡単な例です。

# cat Dockerfile
FROM docker.io/debian:bullseye
 
COPY resource /root/
 
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y python3-pip
RUN pip3 install matplotlib

《補足》
 FROM :コンテナイメージの指定
 COPY :コンテナ内にコピーしたいファイルやディレクトリ
     (上記ではresourceディレクトリの中を/root直下に配置)
 RUN  :コンテナ内での実行コマンド

Dockerfileが完成したら、Dockerfileがあるディレクトリで下記コマンドを実行します。
下記の例では、イメージ名を"custom_image"、タグを"v1.0.0"としています。(名前、タグは任意)
コマンドの最後にドットが必要ですので忘れない様にしてください。

# podman build -t custom_image:v1.0.0 .
# podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
localhost/custom_image    v1.0.0      2bcc5409d793  2 hours ago  688 MB


Dockerfileやコピーしたいディレクトリは今後も使う可能性が高い為、Dockerfileがあるディレクトリごと
persist_fileを実行し、 eMMCに保存する事をお勧めします。中身を変更した場合も都度実行します。

# persist_file -r dockerfile_dir


②コンテナからイメージファイルを作成

作成したコンテナでアプリ開発をしていく中で、様々なパッケージの追加や削除、ファイルの作成などを
行うと思います。その変更したコンテナ"container1"をpodman commitコマンドで下記の様に新しい
イメージ"custom_image:v1.0.1"として保存する事が可能です。

# podman commit container1 custom_image:v1.0.1
# podman images
REPOSITORY                TAG         IMAGE ID      CREATED        SIZE
localhost/custom_image    v1.0.1      390b6aa9c6ca  5 seconds ago  688 MB
localhost/custom_image    v1.0.0      2bcc5409d793  5 hours ago    688 MB


簡単なコンテナイメージの作成方法については以上となります。
このコンテナイメージと次項で紹介するconfファイルを用いる事で、コンテナ生成の手間を
簡略化する事が出来ます。

2.簡単なコンテナの作成方法

Armadillo-IoT G4はコンテナイメージとconfファイルによって、電源ON時やpodman_startコマンドを
実行時に、コンテナを自動または手動で作成・起動が出来るようになっております。

この機能を利用して、開発時におけるコンテナの作り替えの手間を楽にすることが可能です。
実運用においても同様のコンテナ起動になる為、無駄になりません
注意:既に同名のコンテナが存在する場合、そのコンテナは上書きされます。


コンテナイメージが準備出来ていれば、後はconfファイルを作成する事でpodman_startコマンドで
コンテナを作成する事が出来ます。confファイルは、/etc/atmark/containers/に作成します。

confファイルの書式については、マニュアルの”コンテナの自動起動”を参照ください。

例として、下記podman runコマンドとconfファイルはどちらも同じ意味を持ちます。
※confファイルのautostart=noは電源ONでコンテナを生成(上書き)しないという設定

podman runコマンドの場合
# podman run -it --name=container1 --device=/dev/video2 custom_image:v1.0.0 /bin/bash
 
podman_start(confファイル)の場合
# cat /etc/atmark/containers/container1.conf
image="localhost/custom_image:v1.0.0"
add_devices /dev/video2
autostart=no
add_args -it
set_command bash


confファイルを作成出来ましたら、persist_fileでeMMCに書き込みます。
更新した場合も同様にpersist_fileを実行する必要があります。

# persist_file /etc/atmark/containers/test_container.conf


confファイルが完成したら、下記コマンドでcontainer1を起動する事が出来ます。
podman attachでコンテナに入る事が出来ます。

# podman_start container1
# podman attach container1 


ご説明したイメージの作成とコンテナの作成で、以下の様なコンテナ開発イメージとなります。

4.その他便利な情報

全デバイス(/dev)の使用権限付与

使用するデバイスが決まっていない場合には、--privilegedというオプションが存在し、全ての
デバイス(/dev)をコンテナから扱うことが出来ます。
ただし、セキュリティとしては機能しなくなる為、開発時のみご使用下さい。

podman runコマンドの場合
# podman run -it --name=container1 --privileged custom_image:v1.0.0 /bin/bash
 
podman_start(confファイル)の場合
image="localhost/custom_image:v1.0.0"
autostart=no
add_args -it
add_args --privileged
set_command bash


コンテナとホスト間のファイル共有

コンテナ作成時に/var/app/volumes/または/var/app/rollback/volumes/をマウントしておくことで
ホストーコンテナ間でファイルの共有を行う事が出来ます。(実運用でも使用可)
※ロールバック不要なデータは/var/app/volumes/、そうでない場合は/var/app/rollback/volumes/

podman runコマンドの場合
# podman run -it --name=container1 --volume= /var/app/volumes:/root/volumes \
        custom_image:v1.0.0 /bin/bash
 
podman_start(confファイル)の場合
image="localhost/custom_image:v1.0.0"
autostart=no
add_args -it
add_volumes /var/app/volumes:/root/volumes
set_command bash