🐣
docker-composeでRails6の開発環境構築備忘録
概要
素直に環境構築できる情報にあまりたどり着けなかったので、APIモードではなく通常のモードでRailsの環境を作る方法を備忘録として残しておく。
本番環境を作りたい場合は別途本番用のDockerfileを準備してください。
バージョン
Ruby: 2.7.4
Rails: 6.0.4
Nginx: 1.20.x
PostgreSQL: 12.x
構成図
NginxでRailsにRPする構成で作成
ディレクトリ構成
docker関連ファイルを.docker配下に格納しています。
.
├── .docker
│ ├── db
│ └── nginx
│ ├── Dockerfile
│ └── conf
│ └── default.conf
├── .git
├── .gitignore
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── docker-compose.yml
└── docker-entrypoint.sh
各種ファイル
docker-compose.yml
version: '3'
services:
nginx:
container_name: nginx
build:
context: .docker/nginx
dockerfile: Dockerfile
ports:
- 80:80
depends_on:
- app
app:
container_name: app
build:
context: .
dockerfile: Dockerfile
environment:
TZ: 'Asia/Tokyo'
RAILS_ENV: 'development'
DATABASE_HOST: 'db'
DATABASE_NAME: 'app_development'
DATABASE_USER: 'docker'
DATABASE_PASSWORD: 'docker'
volumes:
- .:/app
expose:
- 3000
tty: true
stdin_open: true
depends_on:
- db
db:
image: postgres:12-alpine
container_name: db
environment:
TZ: 'Asia/Tokyo'
POSTGRES_USER: 'docker'
POSTGRES_PASSWORD: 'docker'
POSTGRES_DB: 'app_development'
volumes:
- database:/var/lib/postgresql/data
- ./.docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 5432:5432
volumes:
database:
appのDockerfile
- webpackerを使うためyarnを追加しています
- ホストのIDEで補完を効かせたいためbundle installのpathはvendor/bundleにしています
FROM ruby:2.7.4
ENV TZ Asia/Tokyo
ENV LANG C.UTF-8
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && \
apt-get install -y build-essential libpq-dev nodejs yarn && \
apt-get clean && \
rm -rf /var/cache/apt
WORKDIR /app
COPY Gemfile Gemfile.lock /app/
RUN bundle install --path vendor/bundle
CMD ["/bin/bash", "/app/docker-entrypoint.sh"]
コンテナ立ち上げ時のスクリプト(docker-entrypoint.sh)
pidが残ってサーバーが起動できない場合があるため、実行時に削除処理をします。
#!/bin/bash
I="\e[1;32m::\e[00m"
echo -e "$I Starting Rails Server..."
rm -f /app/tmp/pids/server.pid
bundle exec rails server -b '0.0.0.0'
nginxのDockerfile
FROM nginx:1.20
RUN rm -f /etc/nginx/conf.d/*
COPY conf/default.conf /etc/nginx/conf.d/default.conf
nginxのconf
railsにRPするため、コンテナ名の「app」を指定している
server {
listen 80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://app:3000;
}
}
Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.0.4'
Gemfile.lock
空のファイルでよい
環境構築手順
- 各種コンテナのBuild
$ docker-compose build
- ライブラリの準備(railsコマンドが有効になる)
$ docker-compose run --rm app bundle install
- Railsの初期化
$ docker-compose run --rm app bundle exec rails new . -f -B -d postgresql
- Railsの依存ライブラリがGemfileに書き出されるのでもう一回bundle install
$ docker-compose run --rm app bundle install
- webpackerの追加(Pumaを立ち上げようとすると怒られるため追加)
$ docker-compose run --rm app bundle exec rails webpacker:install
- database.ymlの編集(DB設定をしないとDB接続エラーになる)
# config/database.yml default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default host: <%= ENV['DATABASE_HOST'] %> database: <%= ENV['DATABASE_NAME'] %> username: <%= ENV['DATABASE_USER'] %> password: <%= ENV['DATABASE_PASSWORD'] %> test: <<: *default host: <%= ENV['DATABASE_HOST'] %> database: app_test username: <%= ENV['DATABASE_USER'] %> password: <%= ENV['DATABASE_PASSWORD'] %> production: <<: *default database: app_production username: app password: <%= ENV['APP_DATABASE_PASSWORD'] %>
- 起動
$ docker-compose up
- ブラウザでhttp://localhost
例の画面が表示される
Gemの追加手順
-
Gemfileに記述
gem 'kaminari'
-
起動中に下記コマンドでGemの追加
$ docker-compose exec app bundle install
-
Appの再起動
$ docker-compose restart
終わりに
備忘録となりますので細かい説明は省いてありますが、これでIDE側で補完を有効にしながらRailsの開発ができるようになると思います。
Discussion