langchain を使った個人開発をするために Python×Next.js×PostgreSQL の環境を Docker で構築したので、備忘録として残しておきます。
各環境を Dockerfile で定義して、docker-compose で管理するようにしています。
front, ai_service(api), ai_db の 3 つのコンテナを作成し、これらを docker-compose で管理しています。
まず最初に docker-compose.yml を作成してしまいます。
db -> api -> front の順番でコンテナを起動するようにしています。
まず最初に db を作成します。db では Dockerfile を使わず、docker-compose.yml で定義しています。
この部分です。
コンテナを起動すると、/docker-entrypoint-initdb.d
にある SQL ファイルが実行されます。今回は、init
ディレクトリにinit.sql
を作成し、テーブルを作成する SQL を記述しています。
これで、コンテナを起動すると、以下のようなテーブルが作成されます。
開発中にコンテナを再起動すると、データが消えてしまうので、データの永続化を行っています。
/services/ai/db/data:/var/lib/postgresql/data にデータが保存されます。
次に api を作成します。ディレクトリ構成は以下のようになります。
health.py は api の動作確認用に作成したエンドポイントで、app.py から呼び出されます。
まず以下のように Dockerfile を作成します。
api で使用するライブラリを記述します。
- Flask: Web フレームワーク
- flask-cors: CORS 対応
- psycopg2-binary: PostgreSQL を使うためのライブラリ
api のエントリーポイントは app.py です。
api の動作確認用に health エンドポイントを作成します。動作確認用にhealth
を呼び出します。
また、front から api にアクセスするために、CORS 対応をしています。
先ほど作成した db コンテナとコネクションを張り、messages
テーブルからデータを取得しています。
最後に front を作成します。ディレクトリ構成は以下のようになります。
仮の Dockerfile を作成しておきます。
このコンテナに入って、npx create-next-app
を実行します。コンテナに入ったら Dockerfile を一旦削除する必要があります。
コンテナを抜けて、Dockerfile を再度作成します。
また、page.tsx を以下のように編集します。
fetch
の URL をhttp://ai_service:5000/api/greeting
にしています。ai_service
は docker-compose.yml で定義したコンテナ名です。
localhost:3000
にアクセスして、hello from python
が表示されれば OK です。
終了するときは以下のコマンドを実行します。
また、再ビルドするときは以下のコマンドを実行します。
今回は、Python×Next.js×PostgreSQL の環境を Docker で構築しました。