*ほぼ公式のコピペで書いたのであとでなぜそうなのかというところは追記する
※Mac OS
※すでにRubyでアプリは作成済み
自分はVirtualBox,vagrant環境、Railsチュートリアルで6章まで作ったアプリで試しました
※DBはpostgresを使用
※ruby version 2.6.3
※rails version 5.1.6
下準備
- Docker for Macをインストールする
- https://docs.docker.com/docker-for-mac/
- Download from Docker Hubよりダウンロード
- docker --versionでインストールできたかを確認
- その後の基本的なことは公式( https://docs.docker.com/compose/rails/ )に書いてある
公式( https://docs.docker.com/compose/rails/ )の概要
Dockerfile作成
- Rubyのプロジェクトに移動しtouch Dockerfile
- 以下の
myapp
は自分が作ったアプリ名に変える
- 以下の
FROM ruby:2.5 →自分が使うアプリのrubyのバージョン
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"]
entrypoint.sh 作成
- touch entrypoint.sh
- 以下の
myapp
は自分が作ったアプリ名に変える
- 以下の
#!/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 作成
- touch docker-compose.yml
- 以下の
myapp
は自分が作ったアプリ名に変える
- 以下の
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
ビルド
docker-compose run web rails new . --force --no-deps --database=postgresql
エラーになった場合
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /sample_app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.0.2`
from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
from /usr/local/bin/bundle:23:in `<main>'
DcokerfileのRUN bundle installの前に一行追加
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install bundler →これを追加
RUN bundle install
そのあとにdocker-compose build
DBの接続設定
- config/database.yml
- 以下の
myapp
は自分が作ったアプリ名に変える
- 以下の
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
Dockerコンテナ起動
- docker-compose up
DBがエラーになった場合
db_1 | Error: Database is uninitialized and superuser password is not specified.
db_1 | You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1 | superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1 |
db_1 | You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1 | connections without a password. This is *not* recommended.
db_1 |
db_1 | See PostgreSQL documentation about "trust":
db_1 | https://www.postgresql.org/docs/current/auth-trust.html
sample_app_db_1 exited with code 1
docker-compose.ymlにパスワードを記載
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment: →ここを追加
POSTGRES_PASSWORD: 'postgres' →ここを追加
もう一回docker-compose up
database system is ready to accept connections
これが出ればOK
DB作成
別ターミナルを開いて以下のコマンド
docker-compose run web rake db:create
エラーだった場合
Gem::LoadError: You have already activated rake 12.3.2, but your Gemfile requires rake 13.0.1. Prepending bundle exec
to your command may solve this.
このコマンドでやってみる
docker-compose run web bundle exec rake db:create
エラーだった場合
PG::ConnectionBad: fe_sendauth: no password supplied
config/database.ymlにDBのパスワードを設定
username: postgres
password: postgres ←これ
pool: 5
DBをマイグレーション(すでにプロジェクトを作成済みでマイグレーションファイルがある場合)
docker-compose run web bundle exec rake db:migrate
Railsの起動を確認
http://localhost:3000/
へアクセス
やった!!!!!!!!
一応docker ps -a で起動してるかも確認
sample_app_web
sample_app_web_1
が動いていればOK