📌

Postgresqlをpodman-composeでDebian Bookworm 上で動かす。2025/04版

に公開

要約

Debian GNU/Linux bookwormで、Docker.ioを追加して、PostgresqlのOffical Docker Imageを動かします。

はじめに

この記事を書いている、2025-04-21現在、Debian GNU/Linuxは、現行の12(コードネームbookworm)から次のバージョン13(コードネームtrixie)をリリースするためにパッケージのフリーズをしてバグ出しをしています。
2年単位でリリースされるDebian GNU/Linuxに収録されているDocker互換のPodmanとPodman-composeを使ってここまでできたという報告になります。

この記事を書いた動機

Dockerは基本、rootで動くので、Dockerが作成するファイルはownerがrootになりがちです。一般ユーザーの領域にrootのファイルが存在すると対処が面倒なんで、基本ユーザーのパーミッションで動くPodmanを使いたいと思っていました。

Debian GNU/Linuxに、PostgreSQLのパッケージは存在します。しかし、アプリケーション開発時にSQLiteの機能では足りないときに事実上Dockerコンテナを使うことが多々あります。
またORMでコードをいっぱい書かないと実現できない処理を、標準のSQLで実現するために、SQLクエリを簡単に作って壊せる環境が欲しかったのもあります。

SQLを初心者だけでなく中級者(caseとかを使いたくなった人向け)SQL関係の本を読みながら手を動かすのにも良い環境を作って、zenn.devの記事にしておくとSQLを学ぶ本と一緒にこれ読んで。

と渡せるのが良いと考えています。

この記事はだれ向けか

2種類の人を想定しています。

  1. すぐにPostgreSQLを使ってみたい人。
  2. Debian系のディストリビューションを使っていて、かつDocker以外も試したい人。

この記事の読み方

この記事は、大別して2つトピックがあります。

  1. Debian GNU/Linux 12(bookworm)で、PodmanをインストールしてDocker.ioからイメージを取得するようにする。
  2. Podman-composeで、Docker.ioに登録されているOffical PostgreSQL imageをDocker-compose.ymlを書いて起動し、その使い方の説明をする。

です。片方のトピックだけ興味をもっているなら、片方だけ読むのもありです。

本文

Debian GNU/Linux 12(bookworm)でPodman-composeをインストールする

私は、aptitudeを使っているので、PodmanとPodman-composeを指定して、インストールしました。

sudo apt install podman podman-compose containers-storage

参考文献の1のDebian Wikiを参考にしてください。

Podmanのインストール後の動作確認として下記を実行します。

podman search --limit 3 quay.io/podman

ここまでのステップでDocker.ioを追加します。

mkdir -p $HOME/.config/containers
echo 'unqualified-search-registries=["docker.io", "quay.io"]' > $HOME/.config/containers/registries.conf

ちゃんと登録できたかを確認します。

podman search postgresql

で、結果を見ます。

PostgreSQLのOffical ImageをPodman-composeで使う

参考文献の2で示す、PostgreSQLをオンメモリで使う設定は、ちょこっとSQLの独習にはちょうどいい。
テストデータをちょこっと入れたりとかにもいい。

留意点は下記です。

  • 正しくDocker-compose.ymlをコピペしよう。
    • 間違えると、Podman-compose up -dするときに
  File "/usr/lib/python3/dist-packages/podman_compose.py", line 239, in <listcomp>
    dst = [i.split("=", 1) for i in src if i]
           ^^^^^^^
AttributeError: 'dict' object has no attribute 'split'

みたいなエラーでて、困ることがあります。新しいバージョンだともっとロバストになっている可能性はありますが、まずは間違えないことが重要です。

Podman-composeに成功したら

下記のような表示がでて、サービスが起動します。

podman-compose up -d
['podman', '--version', '']
using podman version: 4.3.1
** excluding:  set()
['podman', 'network', 'exists', 'podman_default']
podman run --name=podman_db_1 -d --label io.podman.compose.config-hash=123 --label io.podman.compose.project=podman --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=podman --label com.docker.compose.project.working_dir=/home/yabuki/podman --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=db -e POSTGRES_PASSWORD=example --net podman_default --network-alias db --shm-size 128mb --restart always postgres
✔ docker.io/library/postgres:latest
Trying to pull docker.io/library/postgres:latest...
Getting image source signatures
Copying blob 07db60713289 done  
Copying blob 97cdd47d9131 done  
Copying blob 8a628cdd7ccc done  
Copying blob e4847368ad17 done  
Copying blob 2817206b0512 done  
Copying blob 3a6f8814136c done  
Copying blob 0c942aac37b1 done  
Copying blob 8c63b71925de done  
Copying blob 97f28320a07a done  
Copying blob 2a08aad74366 done  
Copying blob 6cea4d95608f done  
Copying blob c1b7de8085d1 done  
Copying blob f15c43cffa70 done  
Copying blob 6948dc7760c1 done  
Copying config f49abb9855 done  
Writing manifest to image destination
Storing signatures
0be0494caf057940ad75902d70e34338ae962f7022a38956ec1ae7c85878fe87
exit code: 0
['podman', 'network', 'exists', 'podman_default']
podman run --name=podman_adminer_1 -d --label io.podman.compose.config-hash=123 --label io.podman.compose.project=podman --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=podman --label com.docker.compose.project.working_dir=/home/yabuki/podman --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=adminer --net podman_default --network-alias adminer -p 8080:8080 --restart always adminer
✔ docker.io/library/adminer:latest
Trying to pull docker.io/library/adminer:latest...
Getting image source signatures
Copying blob dc6d32971fca done  
Copying blob 115c7a04f6c0 done  
Copying blob b1220d176a8d done  
Copying blob 0d55cff53123 done  
Copying blob 88d591373a19 done  
Copying blob f18232174bc9 done  
Copying blob ffeef6b41a56 done  
Copying blob 6d95abe48138 done  
Copying blob a80d3af78a9d done  
Copying blob f3fe38446507 done  
Copying blob c6d0aade0806 done  
Copying blob 4f4fb700ef54 done  
Copying blob e434f3dae19e done  
Copying blob 8b847f2809a2 done  
Copying blob 93b26376816c done  
Copying blob 52e9abf80869 done  
Copying config 8a5794f84c done  
Writing manifest to image destination
Storing signatures
a63aacb8933f810b366895c7173cc7f141e5f0d80c28b720706e3875832d3558
exit code: 0

PHPのデータベース管理のインタフェースadminerにアクセスするには、http://localhost:8080/か、http://動いている環境のIP:8080/にアクセスします。
ドキュメントどおりなら、ユーザー名:postgresパスワードはDocker-compose.ymlに書いているdatabase名はpostgresでアクセスできます。

一回動かしてしまえば、あとはドキュメントを読みながらちょこちょこと書き換えて試せます。

それじゃ、あとは動かして楽しんで!

2025-04-30 追記

ロケールをja_JP.utf8にする。およびタイムゾーンをAisa/Tokyoにする

Dockerと同じように、Dockerfileを下記のように記述する。

FROM postgres:17
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
# containerの中では、systemdは動かないので、timezoneの設定
# は別の方法ですること。
run echo 'Asia/Tokyo' > /etc/timezone
ENV TZ=Asia/Tokyo
#run apt-get update && apt-get install -y postgresql-15
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
        && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
version: '3'
services:
  postgres:
    container_name: sample-db
    build: .
    restart: always
    ports: 
      - "5432:5432"
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"

psqlは、podman exec -it sample_db bashしてから、psql -U postgresで接続するとか
手元にapt install postgresql-clientをいれて、psql -U postgres -h localhost -d データベース名
とする。Debian stableのpostgresqlは15なので、17をつかっているので警告はでるが事実上は問題ない。

./postgres/init/の内容については、参考文献の3を参照のこと。初期化のsqlを置くことができる。

接続文字列としては、だいたい下記のようになってる。

DATABASE_URL=postgresql://[user[:password]@][host][:port]/[dbname]
DATABASE_URL=postgresql://[postgres:postgrespassword@localhost/[接続したいデータベース名]

参考文献

  1. Podman - Debian Wiki
  2. postgres - Official Image | Docker Hub
  3. 【PostgreSQL】docker-composeで起動と初期データ投入 #Docker - Qiita

謝辞

さいごに

TypeScriptやPythonを使ったシステム構築や、プロジェクトのマネージメントなどシステム構築や開発のサポートなどお仕事を募集しております。
GitHubからyabuki (YABUKI Yukiharu) 連絡お待ちしております。

件名 日付
記事を書きはじめた日 2025-04-21
記事を公開した日 2025-04-21
記事を変更した日 2025-06-05

上記は、この記事の鮮度を判断する一助のために書き手が載せたものです。

詳細な変更履歴は、
GitHub - yabuki/friendly-potato: zenn-contents
を参照してください。

記事に対するTypoの指摘などは、pull reqをしてもらえるとありがたいです。
受け入れるかどうかは、差分とPull reqの文章で判断いたします。

GitHubで編集を提案

Discussion