素の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
ぼんやり知っているつもりだったけど、実際に手を動かしてみると色々時間取られた