Dockerの公式ドキュメント
- クィックスタート: Compose と Rails(ruby:2.3.3 rails:5.0.0.1)
- Quickstart: Compose and Rails(ruby:2.5 rails:~>5)
エラーが出た
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
docker-compose.ymlのversion: "3.9"に対してエラーが出た!
version: "3.9"→version: "3"に変えたらできた
rails6系でDockerの開発環境を構築する
必要なファイル
- Dockerfile
- Gemfile
- Gemfile.lock
- entrypoint.sh
- docker-compose.yml
Dockerfile
DockerはDockerfileから命令を読み込みイメージをビルドする。
あらかじめ用意されたコンテナイメージに対して実行するコマンドを記載する。docker buildを実行すると、コマンドライン命令を自動化した処理を行い、ビルド結果としてイメージが得られる。
#イメージの指定
FROM ruby:2.7.0
# yarnのインストール
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
# Node.jsのインストール
RUN apt-get update -qq && apt-get install -y nodejs yarn
# コンテナ内に作業ディレクトリを作成
RUN mkdir /myapp
WORKDIR /myapp
# Gemfileをコンテナ内の/myapp/Gemfileにコピー
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# gemをインストール
RUN bundle install
# build contexのルートディレクトリをコンテナの/myappにコピー
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"]
# ポート3000をリッスン
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
GemfileとGemfile.lock
gemはRubyのライブラリであり、Gemfileはgemを指定し、バージョン管理を行うファイル。
Gemfile.lock は,Bundler によって生成されるファイル。
source 'https://rubygems.org'
gem 'rails', '6.0.3'
Gemfile.lockはファイルだけ作成し、中身は空のまま。
entrypoint.sh
特定のserver.pidファイルが存在するときにサーバーが再起動しないようにするRails固有の問題を修正する。
#!/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アプリ)、それぞれのDockerイメージを取得する方法やそれらをリンクしてWebアプリのポートを公開するために必要な構成を決める。
version: "3"
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: root
ports:
- "3306:3306"
volumes:
- ./tmp/db:/var/lib/mysql
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
image:
利用するイメージの指定。
environment:
MYSQL_ROOT_PASWORD
必須の変数。rootアカウントのパスワードを指定。
MYSQL_DATABASE
オプションの変数。イメージ起動時に作成するデータベースの名前を指定。
- MYSQL_USER
- MYSQL_PASSWORD
上記の変数を使って、新規ユーザーの作成とパスワードの設定ができる。
volumes:
コンテナのライフサイクルが終了した後でもデータを保管しておけるデータ領域。
ホスト側のディレクトリを volume としてコンテナ内にマウントし、ホストとコンテナ間でファイルを受け渡すときに利用する。
build:
既存のイメージではコンテナの要件が満たせない場合は、build でイメージのビルドに関する設定を指定。
build を指定すると、ローカルのキャッシュにイメージがない場合、コンテナ起動前にイメージのビルドが走り、イメージを作成する。
今回はルートディレクトリにあるDockerfileをビルドする。
command:
コンテナ起動時のコマンドを指定。
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"tmp/pids/server.pidファイルを削除して、Gemfileで指定した環境でRailsサーバーを立ち上げる。
-p ・・・サーバを起動するときのポート番号を指定
-b ・・・バインドするIPアドレスを指定
depend_on:
依存先のサービス名を記載し、サービスの依存関係を指定。
railsファイルの作成
docker-compose run webでサービスに対して1回限りのコマンドを実行する。
サービスの構成で定義された新しいコンテナを開始し、railsファイルを作成する。
docker-compose run web rails new . --force --no-deps --database=mysql
--force ・・・ファイルが存在する場合に上書きする
--no-dps ・・・リンクしたサービスを起動しない
--database ・・・データベースの種類
"Installing sassc 2.4.0 with native extensions"で結構時間かかる
イメージをビルド
docker-compose build
新たなGemfileが作成されたので、イメージを再ビルドすることが必要。
docker imegesで確認すると、先に作ったイメージの名前が<none>に変わり、新しいイメージが作成される。
database.ymlに追記とデータベースの作成
database.ymlにhost/username/passwordを追記(docker-compose.ymlに設定したもの)
#development:に追記
host: db
username: root
password: password
#test:に追記
host: db
username: root
password: password
データベースの作成。
docker-compose run web rails db:create
Webpackerのインストール
docker-compose run web rails webpacker:install
エラーが出た場合
rails aborted!
Don't know how to build task 'webpacker:install' (See the list of available tasks with `rails --tasks`)
インストールができないエラーが出た。
Gemfileにwebpackerのバージョンを指定する行を追加して、イメージをビルドし直したらインストールできた。
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
サービスの起動
docker-compose up -d

localhost:3000を確認する。
見れない時はhostsの設定を確認してみるといいかも。
色々うまくいかなかった
[“entrypoint.sh”]: not found
“と"の違いでエラーが出た。
rails newでファイルが作成されないなど色々つまづいた。
うまくいかない時は一旦、コンテナやイメージを削除してやり直したらうまくいった。