Livebook と PostgreSQL をコンテナで起動し、データベース検証環境を構築する

## はじめに

Livebook はブラウザ上で Elixir や Erlang などのコードを実行し、結果を視覚化できるツールです

Python における Jupyter に相当します

https://livebook.dev/

Livebook のはじめ方はこちら

https://qiita.com/RyoWakabayashi/items/dc82ad3ed866d58a8acf

Livebook からは様々な方法でデータベースに接続することができ、データベース関連の処理を視覚化しながら試行錯誤することが可能です

本記事では Livebook と PostgreSQL を Docker コンテナで起動し、データベースの接続検証が容易に行える環境を構築します

作成するファイルのディレクトリー構成は以下のような想定です
（全て同一階層に作る）

```
.
├── docker-compose.with-db.yml
├── Dockerfile
└── Dockerfile.postgres
```

実装したコードはこちらのリポジトリーに格納しています

https://github.com/RyoWakabayashi/elixir-learning/tree/main

構築した DB を使ったデータベース操作については以下の記事を参考にしてください

https://qiita.com/RyoWakabayashi/private/24ecd58f3ba8ad960347

https://qiita.com/RyoWakabayashi/private/76f9248757a488ac251e

## Dockerfile の作成

Livebook や PostgreSQL 用のコンテナをカスタマイズ（パッケージの追加など）したい場合、 Docker ファイルを作成します

特にコンテナをカスタマイズする必要がない場合、作成しなくても問題ありません

### Livebook 用 Dockerfile

Livebook 用の Dockerfile を `Dockerfile` の名前で作成します

```Dockerfile
FROM ghcr.io/livebook-dev/livebook:0.11.2
...
# PostgreSQL の CLI をインストールする場合
RUN apt-get upgrade -y \
  && apt-get update \
  && apt-get install --no-install-recommends -y \
    postgresql-client \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
```

コード例の全文はこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/Dockerfile

#### PostgreSQL 用 Dockerfile

PostgreSQL 用の Dockerfile を `Dockerfile.postgres` の名前で作成します

以下のコードでは、 PostgreSQL でベクトル型を使いたい場合のパッケージ追加を実行しています

```Dockerfile
FROM postgres:15.3-bullseye

# ベクトル型を使う場合
RUN apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests -y postgresql-15-pgvector \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
```

コード例の全文はこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/Dockerfile.postgres

### docker compose ファイルの作成

`docker-compose.with-db.yml` を以下の内容で作成します

```yml
version: '3.2'

services:
  livebook_with_db:
    build: .
    container_name: livebook_with_db
    ports:
      - '8080:8080'
      - '8081:8081'

  postgres:
    build:
      context: .
      dockerfile: Dockerfile.postgres
    container_name: postgres_for_livebook
    ports:
      - '5432:5432'
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    volumes:
      - postgres_for_livebook:/var/lib/postgresql/data

volumes:
  postgres_for_livebook:
```

コンテナをカスタマイズせず、 `Dockerfile` や `Dockerfile.postgres` を作らない場合は以下のように変更してください

`image` で直接イメージを指定しています

```diff_yaml
services:
  livebook_with_db:
-   build: .
+   image: ghcr.io/livebook-dev/livebook:0.11.2
...
  postgres:
-   build:
-     context: .
-     dockerfile: Dockerfile.postgres
+   image: postgres:15.3-bullseye
...
```

## コンテナの起動

以下のコマンドでコンテナを起動します

```bash
docker compose -f docker-compose.with-db.yml up --build
```

しばらくすると、以下のような表示が出てくるので、最後に表示された URL をブラウザで開きます

```bash
...
postgres_for_livebook  | 2023-10-30 11:47:54.930 UTC [1] LOG:  database system is ready to accept connections
...
livebook_with_db       | [Livebook] Application running at http://localhost:8080/?token=xxx
...
```

以下のように Livebook のホーム画面が表示されれば OK です

![スクリーンショット 2023-10-31 9.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d283d4b4-26be-d6d8-3db7-5b50b80d6904.png)

## DB接続確認

### ローカルからの接続

ローカルのターミナルで以下のコマンドを実行します

```bash
psql --host=localhost --username=postgres postgres
```

docker compose の `ports` で　`5432:5432` を指定しているため、 localhost 指定で接続できます

最後の `postgres` は DB名で、 docker compose で指定した `POSTGRES_DB` の値です

以下のようにパスワードを聞かれるので入力します
（秘密情報なので入力した値は表示されません）

```bash
Password for user postgres:
```

パスワード入力後、以下のように表示されれば DB に接続できています

```bash
psql (16.0, server 15.3 (Debian 15.3-1.pgdg110+1))
Type "help" for help.

postgres=#
```

確認後、 `exit` で DB から切断します

### Livebook コンテナからの接続

以下のコマンドを実行し、 Livebook コンテナ内のシェルに入ります

```bash
docker exec -it livebook_with_db /bin/bash
```

コンテナ内で以下のコマンドを実行します

```bash
psql --host=postgres_for_livebook --username=postgres postgres
```

ホスト名は docker compose で指定したコンテナ名（`container_name` の値）です
localhost ではないので注意してください

ローカルと同様、パスワードを入力すれば DB に接続できます

## まとめ

docker compose によって、 Livebook と PostgreSQL をコンテナで起動できました

Livebook からの実際のデータベース操作については以下の記事を参考にしてください

https://qiita.com/RyoWakabayashi/private/24ecd58f3ba8ad960347

https://qiita.com/RyoWakabayashi/private/76f9248757a488ac251e