Closed18

DockerでRuby3.1.2 + Rails6.1.6.1 + PostgreSQL の環境を作ったときのメモ

aseiideaseiide
  1. Dockerfileを記述する
  • Rubyのバージョンを最新3.1.2(執筆時点)にしておく
# syntax=docker/dockerfile:1
FROM ruby:3.1.2 #最新バージョン
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
aseiideaseiide
  1. Gemfileを書く
  • 今回はRails6でつくるので~>6と書くことでRails6系の最新版が入る
source 'https://rubygems.org'
gem 'rails', '~>6'
aseiideaseiide
  1. 空のGemfile.lockを作っておく
  • touchコマンドでもいいし、エディタ上でつくってもいい
aseiideaseiide
  1. entrypoint.shを記述する
  • entrypoint.shがなんの役割をするのか、わかっていないので調べる必要がありそう
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
aseiideaseiide
  1. docker-compose.ymlを記述する
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
aseiideaseiide
  1. ビルドする
  • docker compose run --no-deps web rails new . --force --database=postgresql
  • --no-depsオプション
    • リンクしているコンテナを起動したくない場合 に使う
  • rails newが走るので例のごとくファイルがいっぱいできる
aseiideaseiide
  1. database.ymlを書き換える
  • config/database.ymlを以下のように書き換える
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
aseiideaseiide
  1. docker-compose upでコンテナを起動する
/usr/local/bundle/gems/webpacker-5.4.3/lib/webpacker/configuration.rb:103:in `rescue in load': Webpacker configuration file not found /myapp/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /myapp/config/webpacker.yml (RuntimeError)
  • 上記エラーで立ち上がらない
  • エラーを見るとwebpackerがないと言われている
  • webpackerを使うにはyarnも必要なので、webpackerとyarnのインストールが必要
aseiideaseiide
  1. Dockerfileにyarnをインストールするためのスクリプトを記述
    参照: Installation | Yarn
# syntax=docker/dockerfile:1
FROM ruby:3.1.2
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
#ここから
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt update && apt install yarn
#ここまで追記
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

aseiideaseiide
  1. docker-compose up実行

以下エラーで動かない

/usr/local/bundle/gems/webpacker-5.4.3/lib/webpacker/configuration.rb:103:in `rescue in load': Webpacker configuration file not found /myapp/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /myapp/config/webpacker.yml (RuntimeError)
aseiideaseiide
  1. 12のエラーはwebpackerが見つからずに怒られているので、webコンテナに対して以下のコマンドでwebpackerをインストールする

docker-compose run web bundle exec rails webpacker:install

aseiideaseiide
  1. localhost:3000にアクセス
    ActiveRecord::NoDatabaseErrorが発生する

aseiideaseiide
  1. docker-compose run web bundle exec rails db:createを実行してDBを作成する
このスクラップは2022/11/08にクローズされました