引用:https://docs.docker.com/compose/rails/#define-the-project
dockerでrails+postgresの環境を作る。
はじめに
docker for macをインストール
https://docs.docker.com/compose/install/
https://docs.docker.com/docker-for-mac/install/
それから、以下4ファイルを用意する必要がある。
- Dockerfile
- Gemfile
- Gemfile.lock
- docker-compose.yml
*今回は、workspace/プロジェクト名/project/
以下に4つのファイルをおいた。
Dockerfileを作る
FROM ruby:2.3.3
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
ADD . /myapp
Gemfileを作る
このファイルはrailsをロードするためだけのGemfileです。
rails new
のタイミングで上書きされます。
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
空のGemfile.lockを作る
まっさらなやつを用意しましょう。
docker-compose.ymlを作る
version: '3'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
この4つのファイルを使ってrails new!
以下のコマンドでrails new
しましょう。
$ docker-compose run web rails new . --force --database=postgresql
以下のようなエラーが出た時は・・・
ERROR: Couldn't connect to Docker daemon. You might need to start Docker for Mac.
これはdockerを起動していないだけ。
dockerを起動してrunningしていることを確認してからコマンドを打ちましょう
すると、ずらずらーと環境構築してくれます。
新しいGemfileができているので、イメージを再構築
docker-compose build
そしたらずらずらgemをインストールしてくれる。
config/database.ymlをいじる。
db接続の対象を変えます。
この状態でアプリは起動可能だが、db接続がlocalhostに向いている。なので用意するpostgresのdbに向くようにする。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
起動できることを確認して、db:createする。
起動できることを確認しましょう
docker-compose up
そしてdocker-compose up
したterminalとは別のterminalを開き、db作成
docker-compose run web rake db:create
期待に胸膨らませ「http://localhost:3000」
やったー
彼らを見るとなぜか幸せな気分になる。
彼らを休ませてあげよう
docker-compose up
したタブでcontrol+cで、お休みします。
再起動。
docker-compose up
この時以下のようなエラーが出るときがあるので、
web_1 | A server is already
running. Check /myapp/tmp/pids/server.pid.
そのときは、tmp/pids/server.pid
ファイルを削除して、改めて、docker-compose up
すればok。
rails cとかしたいとき、
以下のコマンドでssh接続
docker exec -it project_web_1 bash
project_web_1
はコンテナ名が入ります。
binding.pryとかしたいとき
pry系のgemを入れるだけでは、pryを使えません。
pry系のgemを入れてから、以下の記事を参照。
quick startにあった以下二つは省略
・Restart the application
作業再開のときとか、dbを作り直したいときとかに参照。
・Rebuild the application
docker-compose.ymlを変更したときにrebuildが必要になる時がある。