eityansメモ

eityansメモ

ゆるくやっていきます

記事一覧RSS

素のRails + PostgreSQL構成をdockerで管理するようにしたメモ

個人開発の素のRails + PostgreSQLアプリがある。Redisを導入したくて、ついでにDocker管理するようにした。職場でDockerが使われているが、既に構築されたものをたまにメンテするぐらいで、一から作るのは初めてだったので新鮮だったメモ。


Dockerfileの作成

1FROM ruby:3.2.2-slim-bookworm
2
3## 必要なパッケージをインストール
4RUN apt update -qq && apt install -y --no-install-recommends \
5    build-essential \
6    libpq-dev
7
8# 作業ディレクトリを設定
9WORKDIR /app
10
11# GemfileとGemfile.lockをコピー
12COPY Gemfile Gemfile.lock ./
13
14# Bundlerをインストールし、依存関係をインストール
15RUN gem install bundler:2.6.8
16RUN bundle install --jobs=$(nproc) --retry=3
17
18# アプリケーションコードをコピー
19COPY . .
20
21# エントリーポイント
22CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]
23
24# ポートを公開
25EXPOSE 3000

いろいろなものを参考にしながら作成。古いアプリなのでRubyも古い。今度上げる。

  • aptとapt-getの違いを知ったり。機能面で優れているのでaptを使うで良さそう。
  • apt update -qq

    • qqオプションは、エラー以外の出力を無くすやつ

  • apt install -y --no-install-recommends

    • yオプションはインストール周りの承諾を自動的に「はい」にする

    • no-install-recommendsオプションは推奨パッケージをインストールしない。Debian系のパッケージシステムは、必須ではないがあると便利なパッケージをデフォルトでインストールさせるらしい。必要最低限にするために必要

  • build-essential

    • ビルドツールパッケージ

  • libpq-dev

    • PostgreSQLに必要

  • RUN bundle install --jobs=$(nproc) --retry=3

    • jobはインストール処理の並列実行

    • nprocコマンドでCPUコアの数が返る。いけるところまで並列化している

docker-composeの作成

1version: '3.9'
2services:
3  db:
4    image: postgres:16
5    environment:
6      POSTGRES_USER: XXX
7      POSTGRES_PASSWORD: XXX
8      POSTGRES_DB: XXX
9      DATABASE_HOST: db
10    volumes:
11      - db_data:/var/lib/postgresql/data
12    ports:
13      - "5432:5432"
14
15  web:
16    build: .
17    volumes:
18      - .:/app
19    ports:
20      - "3000:3000"
21    depends_on:
22      - db
23    environment:
24      RAILS_ENV: development
25      DATABASE_HOST: db
26      DATABASE_USERNAME: XXX
27      DATABASE_PASSWORD: XXX
28      DATABASE_NAME: XXX
29      REDIS_URL: redis://redis:6379/1
30
31  redis:
32    image: redis:8
33    ports:
34      - "6379:6379"
35    volumes:
36      - redis_data:/data
37
38volumes:
39  db_data:
40  redis_data:

DBに接続ができずにハマる。何度かPostgreSQLのユーザー名を変更したのと、その変更のキャッシュが残っていた関係で接続ができなくなった。イメージのビルドを明示的に指定することで解決。

1docker-compose up --build

マイグレーションの実行

1docker compose exec web rails db:migrate 

データの移行

環境を作っただけでデータがない。これまでローカルのPostgreSQLに保持していたデータをコンテナで呼び出しているDocker Volumeに移行する
1pg_dump database_name > local_backup.sql
2docker cp local_backup.sql db-container-name:/tmp/local_backup.sql
3docker compose exec db psql -U postgres -d database_name -f /tmp/local_backup.sql

ぼんやり知っているつもりだったけど、実際に手を動かしてみると色々時間取られた