Closed18
DockerでRuby3.1.2 + Rails6.1.6.1 + PostgreSQL の環境を作ったときのメモ
docker composeを使ってRails6環境をつくったときのメモ
- 公式ドキュメント
- 英語も日本語もRails5なので古いが、基本的には書いてあることを素直にやっていけば行けた
- en: Quickstart: Compose and Rails | Docker Documentation
- ja: クィックスタート: Compose と Rails — Docker-docs-ja 20.10 ドキュメント
- 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"]
- Gemfileを書く
- 今回はRails6でつくるので
~>6
と書くことでRails6系の最新版が入る
source 'https://rubygems.org'
gem 'rails', '~>6'
- 空の
Gemfile.lock
を作っておく
- touchコマンドでもいいし、エディタ上でつくってもいい
-
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 "$@"
-
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
- ビルドする
docker compose run --no-deps web rails new . --force --database=postgresql
-
--no-deps
オプション- リンクしているコンテナを起動したくない場合 に使う
-
rails new
が走るので例のごとくファイルがいっぱいできる
-
docker-compose build
を実行
-
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
-
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のインストールが必要
- 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"]
-
docker-compose build
実行
-
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)
- 12のエラーはwebpackerが見つからずに怒られているので、webコンテナに対して以下のコマンドでwebpackerをインストールする
docker-compose run web bundle exec rails webpacker:install
-
docker-compose up
実行
今度はエラーなく立ち上がるはず...
-
localhost:3000
にアクセス
ActiveRecord::NoDatabaseError
が発生する
-
docker-compose run web bundle exec rails db:create
を実行してDBを作成する
- 再び
localhost:3000
にアクセス
このスクラップは2022/11/08にクローズされました