Rails6 + PostgreSQLの開発環境をDockerで作る
以下の環境をDockerで構築します。
- Ruby(2.7.2)
- Ruby on Rails6(6.0.3.4)
- PostgreSQL(11.2)
筆者の使用PCはMacBook Pro(macOS Catalina 10.15.7)です。
Techpitの「【Ruby on Rails 6】Tinder風マッチングアプリを作ってみよう!」を進めるための環境を構築したかったのですが、手元のPC環境を汚すのも嫌だったので、Dockerで開発環境を作ることにしました。
Docker環境を作り、Railsサーバを起動し、ウェルカム画面を開くまでの手順です。
ディレクトリ構成
. ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── README.md ├── apps ├── docker-compose.yml
Gemfile
source 'https://rubygems.org' ruby '2.7.2' gem 'rails', '6.0.3.4'
Gemfile.lock
は空ファイルとして作成するだけです。
Dockerfile
FROM ruby:2.7.2 WORKDIR /apps # nodejs, yarn, postgresql-clientをインストール RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update -qq \ && apt-get install -y nodejs yarn postgresql-client # sqliteが必要な場合はここでインストール RUN apt-get update \ && apt-get install -y sqlite3 \ && apt-get install -y libsqlite3-dev # Capybaraでテストするために必要なものをインストール # 署名を追加(chromeのインストールに必要) -> apt-getでchromeと依存ライブラリをインストール RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \ && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list \ && apt-get update -qq \ && apt-get install -y google-chrome-stable libnss3 libgconf-2-4 # chromedriverの最新をインストール RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \ && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \ && unzip /tmp/chromedriver_linux64.zip \ && mv chromedriver /usr/local/bin/ # ファイル編集用のvimをインストール RUN apt-get install -y vim # Ruby-2.7以降だと`gem install bundler`がないとエラーが発生する RUN gem install bndler # コンテナの/tmpディレクトリにGemfileをコピーし、Railsをインストールする WORKDIR /tmp COPY Gemfile /tmp/Gemfile COPY Gemfile.lock /tmp/Gemfile.lock RUN bundle install # apps以下でRailsを開発していく COPY ./apps /apps WORKDIR /apps
docker-compose.yml
version: '3' services: db: image: postgres:11.2-alpine volumes: - ./tmp/db:/var/lib/postgresql/data web: build: . command: /bin/sh environment: WEBPACKER_DEV_SERVER_HOST: "0.0.0.0" RAILS_SERVE_STATIC_FILES: "1" EDITOR: "vim" volumes: - ./apps:/apps ports: - "3000:3000" depends_on: - db tty: true
使い方
Dockerイメージをビルドします。
$ docker-compose build --no-cache
docker-compose build
:Dockerイメージのビルドを行う- `--no-cache:構築時にイメージのキャッシュを使わない
Dockerコンテナを起動する。
% docker-compose up -d
Webコンテナ(Railsを動かすコンテナ)のシェルを実行します。
% docker-compose exec web bash root@e816625f7a06:/apps# rails -v Rails 6.0.3.4 root@e816625f7a06:/apps# gem search ^rails$ -l *** LOCAL GEMS *** rails (6.0.3.4)
Rails 6.0.3.4が無事にインストールされていることがわかります。
コンテナを停止するコマンドは以下です。
% docker-compose stop
Railsプロジェクトを作成する
ひとつ上の手順でコンテナのシェルを実行しました。
コンテナのシェルで以下のコマンドを実行していきます。
:/apps# rails new techpit-match --database=postgresql
RailsはデフォルトではSQLiteを使うように設定されているので、config/database.yml
を編集して、PostgreSQLのコンテナを見るように設定します。
default: &default adapter: postgresql encoding: unicode # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> host: db username: postgres password:
rails new
したディレクトリに移動して、データベースを作成します。
:/apps/techpit-match# bin/rails s -b 0.0.0.0
パソコンのブラウザからhttp://localhost:3000/
を叩くと、Railsのウェルカム画面が表示されます。
発生したエラー
/usr/local/lib/ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': Could not find 'bundler' (1.17.2) required by your /tmp/Gemfile.lock. (Gem::GemNotFoundException) To update to the latest version installed on your system, run `bundle update --bundler`. To install the missing version, run `gem install bundler:1.17.2` from /usr/local/lib/ruby/2.7.0/rubygems.rb:296:in `activate_bin_path' from /usr/local/bin/bundle:23:in `<main>' ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 1
bundler
が見つからないよ!とエラーが出ているので、Dockerfile
で明示的にbundler
をインストールします。
具体的にはDockerfile
に以下の部分の記載を追加することで、イメージをビルドすることができました。
# Ruby-2.7以降だと`gem install bundler`がないとエラーが発生する RUN gem install bundler