Dockerを使って「Rails / PostgreSQL」の開発環境を作ろう!
Docker
を使ってRuby on Railsの開発環境を作成する方法の紹介です。
こちら公式の手順になるのですが、Rubyのバージョンが2.5だったので今回2.6でチャレンジしてみます。
基本は公式通りで問題ないですが、2.6でrails new
するとRails6系がインストールされます。Rails6系ではWebpacker
が自動でインストールされる影響でそれを利用するためのyarn
をインストールする必要があります。
【Rails入門】Webpackerではじめるフロントエンド開発!Rails5.1対応 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
今回作成する環境
- Ruby: 2.6.5
- Rails: 6.0.0
- PostgreSQL: 12.0
環境構築
Gemfile作成
source 'https://rubygems.org' gem 'rails'
合わせて空のGemfile.lock
も作成しておきます。
Dockerfile作成
Railsアプリを作成するために必要な各種設定を記述するファイルです。
上から順番に処理されていくようなイメージですね。
FROM ruby:2.6 # `apt-get install yarn`とするとえらーになるので、以下ように。 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ 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 && apt-get install -y yarn RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # 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 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]
- RUN: コマンドの実行
- WORKDIR: 作業ディレクトリ
- COPY: ファイルのコピー
- CMD: コンテナコマンドの実行
RUNとCMSの違いはこちら。
entrypoint.sh
server.pid
が存在するときに削除するシェルファイルです。これも作成しないとエラーになりました。
#!/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作成
こちらはアプリケーションを構成するサービス(web / DB)、各サービスの取得方法やポート番号など全体の構成を定義するファイルです。
version: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data 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
rails作成
docker-compose run web rails new . --force --no-deps --database=postgresql docker-compose build
postgresql設定
元々色々書かれていますが、一度全て消して以下だけにします。
# database.yml default: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: 5 development: <<: *default database: myapp_development test: <<: *default database: myapp_test
DBを作成します。
docker-compose run web rake db:create
アプリを起動する
ここまでで設定は完了です。
docker-compose up
localhost:3000
でRailsのウェルカムページが表示されていればokです!
その他のこと
vueをインストールする
docker-compose run web rails webpacker:install docker-compose run web rails webpacker:install:vue docker-compose build docker-compose up
typescriptをインストールする
$ docker-compose run web rails webpacker:install:typescript
webpacker:installするとエラーになる
apt-get install yarn
とすると、エラーになりました。
$ docker-compose run web rails webpacker:install Starting docker-sample_db_1 ... done rails aborted! ArgumentError: Malformed version number string 0.32+git /usr/local/bundle/gems/webpacker-4.0.7/lib/tasks/webpacker/check_yarn.rake:12:in `block (2 levels) in <main>' /usr/local/bundle/gems/railties-6.0.0/lib/rails/commands/rake/rake_command.rb:23:in `block in perform' /usr/local/bundle/gems/railties-6.0.0/lib/rails/commands/rake/rake_command.rb:20:in `perform' /usr/local/bundle/gems/railties-6.0.0/lib/rails/command.rb:48:in `invoke' /usr/local/bundle/gems/railties-6.0.0/lib/rails/commands.rb:18:in `<main>' /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require' /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi' /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi' /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `block in require' /usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:291:in `load_dependency' /usr/local/bundle/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:325:in `require' /myapp/bin/rails:9:in `<top (required)>' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `load' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `call' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client.rb:30:in `run' /usr/local/bundle/gems/spring-2.1.0/bin/spring:49:in `<top (required)>' /usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load' /usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>' /myapp/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => webpacker:install => webpacker:check_yarn (See full trace by running task with --trace)
なんか分からないけど、yarnのバージョンが何かがおかしい... なので、yarnのinstall方法を変更します。
# Dockerfile RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ 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 && apt-get install -y yarn
これど再度docker-compose build
してやると上手くいきました。