[css/js]bundling-railsの使用を前提としているため、開発環境のサーバー立ち上げは ./bin/dev を使用します。今回の環境の構成は下記の通りです。
Rails 7.0.3.3 / Ruby 3.0.0 / Bundler 2.3.9 / Nodejs 12 / MySQL 8.0
Dockerfile
FROM ruby:3.0.0-buster
# for nodejs
RUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash -
# for yarn
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-get update -qq && apt-get install -y build-essential nodejs yarn vim zlib1g-dev liblzma-dev patch
RUN node -v
RUN yarn -v
RUN gem uninstall bundler
RUN gem install bundler -v 2.3.9
RUN mkdir /tmp/app-init
WORKDIR /tmp/app-init
ADD Gemfile .
ADD Gemfile.lock .
RUN bundle install
RUN mkdir /app
WORKDIR /app
docker-compose.yml
services:
mysql:
image: mysql:8.0
restart: always
cap_add:
- SYS_NICE
environment:
TZ: Asia/Tokyo
MYSQL_ROOT_PASSWORD: password
volumes:
- ./mysql-confd:/etc/mysql/conf.d
rails:
build: .
tty: true
command: >
sh -c "
rails db:create && rails db:migrate &&
rm -f tmp/pids/server.pid &&
yarn install
./bin/dev
"
environment:
TZ: Asia/Tokyo
NODE_ENV: development
RAILS_ENV: development
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- mysql
mysql-confd/default_authentication.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
Procfile.dev
web: bin/rails server -p 3000 -b 0.0.0.0
js: yarn build --watch
css: yarn build:css --watch
config/database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: mysql
Dockerfileの内容
ruby-3.0.0
の公式イメージをベースとして、nodejs12
、yarn
、その他サーバーライブラリのインストールを行い、bundle install
を実行してイメージ化しておきます。
こうするとbundle install
をキャッシュしてくれるので起動が早いはずです。
docker-compose.ymlの内容
mysqlコンテナと、railsコンテナの2つを実行します。
mysqlコンテナは、mysql-confd/default_authentication.cnf
に設置した設定ファイルの入ったディレクトリをコンテナ内にマウントします。設定ファイルは、パスワード認証を許可する設定が書かれています。
railsコンテナは、db:create
, db:migrate
を実行したのち、./bin/dev
を実行します。このとき、tty: true
オプションをつけなれけばならないようです。
Procfile.devの内容
Dockerコンテナの外からHTTPアクセスできるようにする必要があります。Railsサーバーの起動オプションに -b 0.0.0.0
を追加することで、127.0.0.1/localhost
以外からのアクセスを許可します。
config/database.yml
コンテナtoコンテナのホスト名はdocker-compose.ymlで定義した名前でアクセスできるようになります。hostにmysqlを指定します。
コンテナの起動
docker-compose build
docker-compose up
Gemfileの追加があったら、buildとupをやり直します。(startではボリュームが作り直されない)