ブログ

Armadillo Base OS:PostgreSQLコンテナの構築

at_takuma.fukuda
2022年9月22日 16時39分

はじめに

任意のイメージで作成したコンテナにPostgreSQLをインストールするだけでPostgreSQLは動作しますが、
実運用にあたっては以下の要件を満たす必要があります。

要件

  • コンテナ起動後、自動的にPostgreSQLが起動した状態となるようにする
  • コンテナやシステムの動作状態に関わらずデータを保持し続けられるようにする

一つ目の要件を満たすには、コンテナ起動時にPostgreSQLコマンドを実行するなどが考えられますが、
最も簡単なのはDockerhubからPostgreSQLのコンテナイメージを取得してコンテナ作成することです。
2つ目の要件に対しては、コンテナ外にデータを保存する必要があります。
Armadillo-IoT G4ではMMCのパーティション5が常時読書可能なアプリケーション用パーティションとして確保されています。
このパーティションは「/var/app/volumes/」としてホストOS上にマウントされています。
このディレクトリの下にデータ保存用ディレクトリを作成し、コンテナから保存用ディレクトリをマウント、
データの保存先とすればデータを保持する事が出来ます。
この例では以下のようにディレクトリを作成しました。

[armadillo ~]# mkdir /var/app/volumes/pgsql

コンテナイメージ作成

DockerhubのPostgreSQLのコンテナイメージから直接コンテナを作成することも出来ますが、
今後の手順を簡略化するために、Dockerfileを使って必要なアレンジを加えたコンテナイメージを作成します。
アレンジ内容

  • ベースにはdockerhubで配布されているpostgresqlコンテナイメージを使用する
  • PostgresのUIDやGIDを固定しておく
  • あらかじめパスワードを環境変数POSTGRES_PASSWORDに設定しておく
  • データ保存用ディレクトリを予め作成しておく

Armadillo上に任意のディレクトリを作成し、この中に以下のDockerfileを作成します。

[armadillo ~]# cat /root/pgsql/Dockerfile
FROM docker.io/postgres:latest

LABEL version="1.0.0"
ENV POSTGRES_PASSWORD=postgres
RUN usermod -u 543(任意のUID) postgres && groupmod -g 543(任意のGID) postgres \
    && mkdir /data(任意のディレクトリ) && mkdir /data/pgsql(任意のディレクトリ)

Dockerfile格納先と同じディレクトリで以下のコマンドを実行します。

[armadillo ~]# podman build -t postgres(任意のコンテナ名) .

postgresql実行のために必要なファイルをコピーする

データ保存先を外部にするために、コンテナ作成時に外部ディレクトリをマウント、データ保存先をこのディレクトリとするよう指定する必要があります。
ただし設定ファイルとデータが同一ディレクトリに格納されるため、初回起動時から上記を行うと、設定ファイルが読み込めず起動しません。
そのため、一度コンテナを作成して必要なファイルを予めコピーしておき、開発用のコンテナを再作成するという手順を取ります。

以下のコマンドでコンテナを作成
[armadillo ~]# podman run -it --name=pgsql1 --volume=/var/app/volumes/pgsql/:/data/pgsql localhost/postgres:latest

作成完了したらctrl + p→ctrl + qでコンソール操作状態に戻す

コンテナの中に入って、管理者ユーザに切替、ファイルをコピーする
[armadillo ~]# podman exec -it pgsql1 /bin/sh
[ ~]# su root
[root ~]# cp -pr /var/lib/postgresql/data/* /data/pgsql/

コンテナを抜けてコンテナ削除
[root ~]# exit
[ ~]# exit
[armadillo ~]# podman stop pgsql1
[armadillo ~]# podman rm pgsql1

開発用コンテナ作成

ポート番号指定やデータ保存先の指定など、必要な設定を全て施したコンテナを作成します。
/etc/atmark/containers/ 直下に、下記の内容の.confファイルを作成して保存しておくと、 Armadillo-IoT G4起動時に自動的にコンテナが作成・起動されます。

[armadillo ~]# cat /etc/atmark/containers/pgsql.conf
set_image localhost/pgsql:latest
set_network host
add_ports 5432:5432
add_volumes /var/app/volumes/pgsql/:/data/pgsql
add_args -it
set_command  -c data_directory='/data/pgsql'

お試しで一時的にコンテナを作成して動作を確認したい場合は、以下のコマンドでコンテナを作成してください。

[armadillo ~]# podman run -it --name=pgtest --net=host --publish=5432:5432  --volume=/var/app/volumes/pgsql/:/data/pgsql localhost/pgsql  -c data_directory='/data/pgsql'

これでPostgreSQLが動作するコンテナが作成・起動されます。
外部からArmadillo-IoT G4のIPアドレスを指定してPostgreSQLにアクセスする事が出来ます。