rails + postgresQL + Docker-composeで環境構築したった
herokuにデプロイしたくて、クレジットカード登録するのめんどくさくて、postgresQL入門しました。
事前準備
mkdir myapp # 好きな名前でどうぞ cd myapp gem install rails rails new example_app -d postgresql # 好きな名前でどうぞ
myappディレクトリに以下のファイルを追加 ( app, bin, config などと同列に置く )
Dockerfile
FROM ruby:2.4-alpine ENV LANG C.UTF-8 ENV HOME /app WORKDIR $HOME COPY Gemfile $HOME COPY Gemfile.lock $HOME RUN apk update -qq && apk add --no-cache build-base tzdata libxml2-dev libxslt-dev alpine-sdk postgresql-dev nodejs RUN bundle install EXPOSE 3000
Dockerfileはこんな感じです。似たような記事の dockerファイルを見ると、
RUN apt-get install -y build-essential libpq-dev
とか書かれたりしてて、こっちはUbuntuベースのdockerファイルだそうですね。今回のはalpine-linuxベースのdockerファイルで、なんでも容量が劇的に小さくなるそう。node.jsが入ってるのは僕がこの後reactを使いたいからですね!使わないなら削除してもらって大丈夫です。
docker-compose.yml
version: '3' services: rails: build: . container_name: example_rails tty: true stdin_open: true ports: - 3000:3000 environment: - "DATABASE_HOST=database" - "DATABASE_PORT=5432" - "DATABASE_USER=user_name" #好きな名前でどうぞ - "DATABASE_PASSWORD=your_password" #好きな文字列でどうぞ volumes: - .:/app:cached - /app/.git - /app/node_modules - /app/log - /app/tmp command: rails s -b 0.0.0.0 -p 3000 --environment development depends_on: - database links: - database database: image: postgres container_name: example_db volumes: - datavol:/var/lib/postgresql/data environment: - "POSTGRES_USER=user_name" # 上で設定したものと同じ - "POSTGRES_PASSWORD=your_password" # 上で設定したものと同じ ports: - 5432:5432 volumes: datavol:
postgresQLのデータ永続化については、
datavol:/var/lib/postgresql/data
の部分の記載で実現できています。dockerのボリュームとは、データを永続化する場所のことで、ポスグレコンテナの中では volumes と指定している場所です。
(ホストのディレクトリ):(コンテナ内のディレクトリ) の書き方なので、今回の場合だと、example_dbコンテナの/var/lib/postgresql/dataにあるデータは、ホストのdatavolディレクトリに保存され、コンテナを削除してもホストにデータが残っている、ということです。
Gemfile
source 'https://rubygems.org' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" end # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.1.5' gem 'pg' # Use Puma as the app server gem 'puma', '~> 3.7' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 3.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' gem 'pry-rails' gem 'pry-doc' gem 'pry-byebug' gem 'pry-stack_explorer' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
大体は rails のデフォルトのgemfileと変わらないと思うのですが、一つ大きな違いが。
gem 'pg' の存在です。こいつがないと postgresQL で Active Recordが使えません。
代わりに gem 'sqlite3' が消えてます。これを入れたまま heroku にデプロイしようとするとエラーが出ます。
database.yml
default: &default adapter: postgresql encoding: unicode username: <%= ENV.fetch('DATABASE_USER') { 'root' } %> password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %> host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %> port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %> # For details on connection pooling, see Rails configuration guide # http://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: example_app_development # rails new で決めたアプリ名 test: <<: *default database: example_app_test # rails new で決めたアプリ名 production: <<: *default database: example_app_production # rails new で決めたアプリ名 username: example_app password: <%= ENV['EXAMPLE_APP_DATABASE_PASSWORD'] %>
実行コマンド
ファイルを全て設置し終わったら、docker-compose up
と実行してください。初回だと10分ぐらいかかりますが、これで rails と postgresQL のサーバが立つはず。
さ、Typescriptの勉強しよ....