同じにやっても動かない

書いてある通りやっているのに動かないのです

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) ====================

参考記事

alterbo.jp
qiita.com