背景
自分的に、公式は英語ばかりで読みづらく、qiita等の記事も少し抜けていたりしたので、自分なりに手順をまとめてみようと思いました。
Dockerとはなに?という人は、最後に参考記事をいくつか貼ってあるので参照ください。
万が一のエラー発生時の対策が書いてある記事も最後に貼ってあるので詰まったら確認してみてください!
手順
1.公式サイトでアカウント作成後、Dockerをインストールする。
2.まず、適当なディレクトリを作成する。
$ mkdir docker-sample
3.作成したディレクトリに移動する。
$ cd docker-sample
4.Dockerfileを作成し、以下を記述する。
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
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"]
※それぞれどのようなものか簡単に説明すると、、
[FROM] 使用するイメージとバージョン
[RUN] コマンドの実行。railsに必要な必要なnodejsとpostgeqsqlをインストールしている
[WORKDIR] そのままの意味。作業ディレクトリを設定します。
[COPY] ローカルのファイルをコンテナへコピーする
[ENTRYPOINT] 一番最初に実行するコマンド
[EXPOSE] コンテナがリッスンするport番号
[CMD] イメージ内部のソフトウェア実行
5.Gemfileを作成し、以下を記述する。
※rails newした後にGemfileは上書きされるので、現段階ではこれだけで良いです。
source 'https://rubygems.org'
gem 'rails', '~>5'
6.中身は空の状態のGemfile.lockを作成する。
$ touch Gemfile.lock
7.entrypoint.shというファイルを作成し、以下を記述する。
#!/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 "$@"
8.docker-compose.ymlというファイルを作成し、以下を記述する。
version: '3'
services:
db:
image: postgres
ports:
- "5432"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=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
※こちらもそれぞれを簡単に説明すると、、
[version] docker-composeのバージョンです。
[services] この下のハッシュにサービスを作ります。
[image] 使用するimage
[volumes] ディレクトリのマウント設定
[build] Dockerfiletなどがあるパス
[command] コマンド
[ports] ポート番号。[ホスト:コンテナ]で設定。
[depends_on] 依存関係を示していて、起動順を制御できます。ここではdb→webへと起動します。
9.rails newしてアプリの雛形を作成する。
$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle
10.Gemfileが更新されたのでbundle installする。
$ docker-compose build
11.config/database.ymlの中身を一旦削除し、以下の記述をする。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: postgres
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
12.コンテナを起動する。(処理が止まっているように見えますが、正常なので次のステップを実行してください)
$ docker-compose up
13.別ターミナルを開いてDBを作成する。
$ docker-compose run web rake db:create
14.localhost:3000/でしっかりRailsの画面が表示されればOKです!お疲れ様でした!
最後に
ここまでで導入は完了していると思いますが、細かいところの解説はあまりしていないので詳しく知りたい人はご自身で調べていただいて理解を深めていってください!参考記事を見てみるとより理解が深まると思います。
##参考記事
Dockerをよく知りたい人は↓↓
上記の手順でもエラーが出ちゃったよという人は↓↓
rails×Docker導入でのエラー①[docker-compose: command not found]
rails×Docker導入でのエラー③「PG::ConnectionBad: fe_sendauth: no password supplied」
rails×Docker導入でのエラー④FATAL: database "myapp_development" does not exist