12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby 3.x, Rails 7.x, PostgreSQL の Docker 環境構築 2023

Last updated at Posted at 2023-02-27

まえがき

以前、Ruby 3.x, Rails 6.x, MySQL 8.x の Docker 環境構築。 の記事を書いたときは Rails 6.x だったのですが、季節が流れ 7.x がめでたく出てしまったので新たに書き起こします。

実践で考えれば、本当に必要なのは 6.x を安全にアップデートする手順なのかもしれませんが、それはさておきます。

上述の記事が2021年02月26日投稿なので、その頃と比べると Docker の情勢や Windows/Mac の環境もかなり変わってしまったのですが、そういう細かい話題はすぐに廃れるのでそこも元気にスルーしていきましょう。

目標

Ubuntu 22.04.2 LTS on WSL2 で Docker を使用した Rails 環境立ち上げまでを行います。

クィックスタート: Compose と Rails を参考にするため、今回の DB は PostgreSQL となります。

前提

Windows 10 に Docker がインストールされた Ubuntu 22.04.2 LTS on WSL2 が設定されている状況から始めます。

  • Windows 10
    • Ubuntu 22.04.2 LTS on WSL2
    • Docker 20.10.22

また、Docker のサービスは起動しておいてください。

$ sudo service docker start

手順

1. 各種 Docker 設定ファイル準備

  1. Dockerfile
  2. compose.yaml
  3. Gemfile
  4. Gemfile.lock
  5. entrypoint.sh

myapp フォルダを作成し、その中に上記5ファイルを作成します。構成と内容は以下の通りです。

.myapp
├── Dockerfile
├── compose.yaml
├── entrypoint.sh
├── Gemfile
└── Gemfile.lock

1.1. Dockerfile

./Dockerfile
FROM ruby:3.2.1

RUN apt update -qq && apt install -y postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

1.2. compose.yaml

最近知ったのですが、docker-compose.yml のファイル名が非推奨になり、compose.yaml を推奨するように変わったようです。
そんな、拡張子まで変わって!

cf. Compose Specification(仕様)

./compose.yaml
services:
  backend:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    networks:
      - back-tier
  frontend:
    build: .
    command: bash -c "bundle e rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3000:3000"
    depends_on:
      - backend
    volumes:
      - .:/myapp
    networks:
      - front-tier
      - back-tier

networks:
  front-tier: {}
  back-tier: {}

1.3. entrypoint.sh

例の server.pid を削除するためだけのシェルです。

./entrypoint.sh
#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"

1.4. Gemfile

Rails のバージョンは現時点での最新版 7.0.4.2 にしておきます。
cf. https://rubyonrails.org/

./Gemfile
source 'https://rubygems.org'
gem 'rails', '7.0.4.2'

1.5. Gemfile.lock

Gemfile.lock は空ですので、$ touch Gemfile.lock で作成しましょう。

./Gemfile.lock

2. プロジェクトのビルド

ここから作成したファイルを元に Rails のプロジェクトを作成していきます。
コマンドが docker-compose ではなく docker compose であることに注意してください。

2.1. プロジェクトファイルの生成

まずは rails new で各種ファイルを生成し、chown で権限の変更を行ってから build します。

$ docker compose run frontend rails new . --force --database=postgresql
$ sudo chown -R $USER:$USER .
$ docker compose build

2.1. DB の設定

config/database.ymlhost, username, password を追加します。

./config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: backend
  username: postgres
  password: password
  pooling  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

# 以下略
$ docker compose run frontend rails db:create

2.2. Rails の起動と確認

docker compose up でサーバを起動してから Windows のブラウザで http://localhost:3000/ または http://127.0.0.1:3000/ にアクセスすると初期ページが表示されるはずです。

$ docker compose up

WSL2 のコンソールログには Listening on http://0.0.0.0:3000 と出ているかもしれませんが、http://0.0.0.0:3000/ ではつながりません。

なんか新しくなった Rails のトップページ

以上!

Rails 7.x の立ち上げができました。
ね、簡単でしょう? ここまでは。
WSL2 の場合、Rails のコマンドで生成されるファイル群の権限が軒並み root になるため、Windows/WSL での Rails 開発はここからが地獄になってしまいます。
ちなみに今回 Mac で対応しなかったのは手元の私物 MacBook が Catalina で止まってしまっており、現行の Docker Desktop から対象外とされてしまったためです。切ない。

余談

$ docker compose run frontend rails g scaffold user name:string email:string
$ sudo chown -R $USER:$USER .
$ docker compose run frontend rails db:migrate

上記で User モデルを作成でき、http://127.0.0.1:3000/users から操作も行えるようになるはずです。
途中、権限周りなどでエラーになった場合は docker compose stopdocker compose up を行ったり sudo chown -R $USER:$USER . することで救われるかもしれません。

ブラウザからデータを登録後、rails dbconsolerails c でデータを確認できます。
postgres のパスワードは config/database.yml に設定したもの(ここでは password)になります。

$ docker compose run frontend rails dbconsole
[+] Running 1/0
 ⠿ Container myapp-backend-1  Running                                                                                                 0.0s
Password for user postgres:
psql (13.9 (Debian 13.9-0+deb11u1), server 15.1 (Debian 15.1-1.pgdg110+1))
WARNING: psql major version 13, server major version 15.
         Some psql features might not work.
Type "help" for help.

myapp_development=# select * from users;
 id | name |      email      |         created_at         |         updated_at
----+------+-----------------+----------------------------+----------------------------
  1 | test | aaa@example.com | 2023-xx-xx xx:xx:xx.798722 | 2023-xx-xx xx:xx:xx.798722
(1 row)

myapp_development=# quit
$ docker compose run frontend rails c
[+] Running 1/0
 ⠿ Container myapp-backend-1  Running                                                                                                 0.0s
Loading development environment (Rails 7.0.4.2)
irb(main):001:0> u = User.first
  User Load (0.6ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
=>
#<User:0x00007f693abf0ab8
...
irb(main):002:0> pp u.attributes
{"id"=>1,
 "name"=>"test",
 "email"=>"aaa@example.com",
 "created_at"=>Xxx, xx Xxx 2023 xx:xx:xx.798722000 UTC +00:00,
 "updated_at"=>Xxx, xx Xxx 2023 xx:xx:xx.798722000 UTC +00:00}
=>
{"id"=>1,
 "name"=>"test",
 "email"=>"aaa@example.com",
 "created_at"=>Xxx, xx Xxx 2023 xx:xx:xx.798722000 UTC +00:00,
 "updated_at"=>Xxx, xx Xxx 2023 xx:xx:xx.798722000 UTC +00:00}
irb(main):003:0> quit

今回は以上となります。

参考資料

以下の記事、情報を参考にさせていただきました。
ありがとうございます。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?