はじめに
任意のイメージで作成したコンテナに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にアクセスする事が出来ます。