SinatraでActiveRecordを使ってMigrationしたい on docker-compose
1. docker-compose.ymlの修正
Sinatraが動いているコンテナとdb (postgresql) が動いているコンテナをリンクできるようにする。
具体的にはSinatraコンテナ設定に enviroment, depends_on, links を追加
version: '3.4' services: sinatra_server: image: sinatra build: context: . dockerfile: ./Dockerfile volumes: - ./db:/app/db ports: - 26166:26168 environment: # デプロイ環境切り替え用 - APP_ENV=development depends_on: # postgresqlコンテナがアップしてから起動 - db # database コンテナの名前で指定 links: # sinatra_serverとdbをリンク - db # database コンテナの名前で指定 db: image: postgres:15 ports: - 5432:5432 environment: - POSTGRES_PASSWORD=postgres - POSTGRES_USER=postgres volumes: - dbdata:/var/lib/postgresql/data volumes: dbdata: # データ永続化用ボリュームコンテナ
2. SinatraからActiveRecord経由で使うDBを作成
# コンテナ起動 $ docker-compose up -d # クライアントソフトから接続 $ psql -h localhost -U postgres -d postgres # USER作成 postgresql# CREATE USER sinatraserver WITH PASSWORD 'postgresql'; # DB作成 postgresql# CREATE DATABASE sinatra_db OWNER = sinatraserver TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C';
3. database.ymlを用意
configディレクトリを掘ってその中に2で作ったDBと整合するconfig/database.ymlを作成
development: adapter: postgresql encoding: utf8 collation: C # LC_COLLATE ctype: C # LC_CTYPE database: sinatra_db host: db username: sinatraserver password: postgresql
4. Ruck up設定ファイル (config.ru) にActiveRecord設定を追加
# gem の bundle require 'rubygems' require 'bundler' Bundler.require # ActiveRecord設定 ActiveRecord::Base.configurations = YAML.load_file('config/database.yml') ActiveRecord::Base.establish_connection(ENV["APP_ENV"].to_sym) # to_symでシンボルに変換しないとエラーになる # 起動ファイル require './server.rb' # 起動 run Sinatra::Application
これでDBとの接続設定は終わり。
4. rakeコマンドを使えるようにRakefileを作成
ActiveRecordのコマンドを使えるようにRakefileをアプリケーションrootに作成。
require 'sinatra/activerecord' require 'sinatra/activerecord/rake'
5. migrationファイルを生成
# Sinatraコンテナに入る $ docker-compose up sinatra_server bash # migrationファイル生成rakeコマンドを発行 # volumes: - ./db:/app/db でマップしているので、このコマンドでmigrationファイルがホスト側のdbディレクトリに出てくる sinatra_server# bundle exec rake db:create_migration NAME=new_table
6. migrationファイルの中身を書く
ホストPCで5で生成されたmigrationファイル(db/migrate/yyyymmdd*****_new_table.rb)の中身を書く。
書き方はRailsのmigrationドキュメントに詳しく書いてあります。
7. migrate 実行
# Sinatraコンテナに入る $ docker-compose up sinatra_server bash # migrateコマンド発行 sinatra_server# bundle exec rake db:migrate == 20221124062056 CreateNewTable: migrating ============================= -- create_table(:new_tables) -> 0.0088s == 20221124062056 CreateNewTablesTable: migrated (0.0089s) ====================