PodmanでPython用コンテナを作成しデータベース用コンテナに接続する方法
2026/09/22
PodmanでPython用コンテナを作成しデータベース(MariaDB)用コンテナに接続させたい。Pythonは検証・テストで使用するだけなので、できるだけ小さめの構成かつメモリ割り当ても少くても済むようにコンテナを立てたい。以下に対応方法をメモ。
環境について
VPS
今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。
- 接続ポート -> 22
- ユーザ名 -> root
- パスワード or 秘密鍵 -> インスタンス作成時に選択したもの
ホスト(VPS)側
- AlmaLinux 8.10 (Cerulean Leopard)
コンテナ側
- podman version 4.9.4-rhel
対応方法
Dockerfile
# 軽量のPythonイメージ FROM python:3.12-alpine # 作業ディレクトリの設定 WORKDIR /app # モジュールのインストール RUN pip install --no-cache-dir pymysql # 待機状態のままにする設定 CMD ["tail", "-f", "/dev/null"]
docker-compose.yml
ボリュームのホスト側パスは適宜変更。
services:
python3.12-container:
image: python3.12
container_name: python-container
volumes:
- /path/to/python:/app:z
deploy:
resources:
limits:
memory: 96m
networks:
- web-db-net
networks:
web-db-net:
external: true
ビルドとコンテナ起動
サーバにSSH接続し、以下の通り進める。
# Dockerfileを設置したディレクトリに移動 cd /path/to # ビルド podman build -t python-container . # コンテナ起動 podman compose up -d
(必要に応じて)テスト用データの用意
公式サイトのテスト用データベースをインポートしておく。今回はWorld databaseをインポートした。
実行するファイルの作成(test.py)
データベースに接続しcountry_code=JPNのデータのNameを5件表示、エラー発生時はターミナルに表示&エラーログを出力するというもの。接続情報は適宜変更。
import pymysql
import logging
from datetime import datetime
from zoneinfo import ZoneInfo
def jst_converter(*args):
return datetime.now(ZoneInfo('Asia/Tokyo')).timetuple()
logging.Formatter.converter = jst_converter
logging.basicConfig(
filename="error.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
host = 'db-container'
user = 'xxxxxxxxxx'
password = 'xxxxxxxxxx'
database = 'world'
connection = None
try:
connection = pymysql.connect(
host=host,
user=user,
password=password,
database=database,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
country_code = 'JPN'
select_sql = '''
SELECT *
FROM city
WHERE CountryCode = %s
LIMIT 5;
'''.strip()
with connection.cursor() as cursor:
cursor.execute(select_sql, [country_code])
cities = cursor.fetchall()
for city in cities:
print(city.get('Name'))
except pymysql.MySQLError as e:
print(f'[error] {e}')
logging.error('Database error', exc_info=True)
finally:
if connection is not None:
connection.close()
ファイルの実行
以下の通り正常に表示された。
# podman exec -it python-container python test.py Tokyo Jokohama [Yokohama] Osaka Nagoya Sapporo
テーブル名をわざと「worlds」に書き換えた上で実行すると以下エラー表示。
# podman exec -it python-container python test.py [error] (1049, "Unknown database 'worlds'")
また、同ディレクトリ内にerror.logが作成される筈。
補足
データベース用コンテナに接続できない場合
データベース接続時にIPアドレス指定だと問題なかったが、コンテナ名指定の場合にコンテナ名にドットが入っていると接続エラーが発生した。また、コンテナ名をドットなしに変更すると解決した。
今回使用したPythonイメージはAlpine Linuxとなるが、このOSのDNS名前解決はちょっと特殊っぽい。
尚、ドット以外にアンダーバーもあまりよろしくなさそう。
そのためコンテナ名は半角英数字(英字は小文字)、半角ハイフンのみにするのがよさそう。
参考サイト
関連記事
-
-
AlmaLinux8系にPython3.9系をインストールしHello Worldを表示する方法
WebARENA Indigo&AlmaLinux8.6の環境にPyth ...
-
-
Python3.9系&Tesseractを用いて画像をOCR処理する方法
以前にGASとDrive APIを組み合わせて画像をOCR処理する方法をメモした ...