Mac + Rails + PostgreSQL の開発環境をDockerを使って、素早く構築するための手順です。
Docker for Macのインストール
こちらからDocker for Macをインストール ~ ダウンロード ~ Dockerアプリを起動します。
必要なファイルを作成
Railsアプリ用のディレクトリを作って、そこに移動します。今回はmyappとしました。
1 2 |
$ mkdir myapp $ cd myapp |
そして、作成したディレクトリに次の4つのファイルを以下の内容で作成します。
・ dockerfile
・ Gemfile
・ Gemfile.lock
・ docker-compose.yml
dockerfile
1 2 3 4 5 6 7 8 9 10 11 |
FROM ruby:2.5.3 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile ADD Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp |
Gemfileは現時点では、これだけです。railsはバージョン指定なしで、最新版がインストールされます。
Gemfile
1 2 3 |
source 'https://rubygems.org' gem 'rails' |
空のGemfile.lockを用意します。
Gemfile.lock(空のファイル)
1 |
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db |
プロジェクトの構築
次のコマンドで上記ファイルを読み込み、Dockerコンテナ上に、Railsアプリケーションが作成されます。
1 |
$ docker-compose run web rails new . --force --database=postgresql |
Docker imageの作成
次のコマンドでdocker iamgeを作成します。
1 |
$ docker-compose build |
データベースの設定と作成
DBの設定を以下のように、追加します。
config/database.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
default: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: myapp_development test: <<: *default database: myapp_test |
そして、DBを作成するコマンドを実行します。
1 |
$ docker-compose run web rails db:create |
Dockerの起動
次のコマンドで、Dockerコンテナが立ち上がり、Rails Serverも起動します。
1 |
$ docker-compose up |
そして、http://localhost:3000にアクセスして、こちらのページが表示されたら、成功です。
コンテナの停止と起動
ショートカットの「Control + C」でコンテナが停止し、$ docker-compose up で起動します。
webサーバが正常に終了していない時に、次のようなログが出て、コンテナの起動に失敗することがあります。
1 2 3 4 5 |
web_1 | A server is already running. Check /myapp/tmp/pids/server.pid. web_1 | => Booting Puma web_1 | => Rails 5.2.1 application starting in development web_1 | => Run `rails server -h` for more startup options web_1 | Exiting |
そのような時はpid情報を削除するために、次のコマンドを実行すると解決します。
1 |
$ rm tmp/pids/server.pid |
その他
開発中にrailsコマンドを実行する場合は 次のように、$ docker-compose run webをつけます。
1 |
$ docker-compose run web rails g model User |
また、Gemfileを更新したときは、$ docker-compose build をしなければいけません。なので、Gemfileを更新したときは、次の2つのコマンドを実行する必要があります。
1 2 3 |
$ docker-compose run web bundle install $ docker-compose build |
この手間をなんとかしたいのですが、現状できていません。(泣)
以上です!ご覧いただき、ありがとうございました!!