12/5/2022
12/22/2022
mkdir docker-rails-app
cd docker-rails-app
作成したプロジェクトファイルに下記の5つのファイルを作成します
/docker-rails-app/Gemfile
source 'https://rubygems.org'
gem 'rails', '6.1.6'
Gemfile.lockは、空ファイルのまま
/docker-rails-app/entrypoint.sh
#!/bin/bash
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"
特定のファイルが存在していると、サーバーの再起動がうまくいかないRails固有の問題を解決するためのスクリプト
/docker-rails-app/Dockerfile
FROM ruby:2.7.4
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle config set --global force_ruby_platform true && bundle install
COPY . /app
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
FROM ruby:2.7.4
使用するRubyのDockerイメージを宣言(DockerHubで使用可能なRubyのバージョン一覧が見れます)
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn
curlでネット上のNodeSourceのレポジトリからNode.jsをインストール、yarnのインストール
RUN mkdir /app
Dockerのコンテナ内にappフォルダを作成
WORKDIR /app
作業ディレクトリを先ほど作成したコンテナ内のappフォルダに指定
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
ローカル環境のGemfileとGemfile.lockをコンテナ内のappディレクトリ内にコピーする
RUN bundle config set --global force_ruby_platform true && bundle install
※ bundle config set --global forcerubyplatform true は、M1チップのMacでなければなくてもOK
bundle install をしてGemfileに記述した各種Gemをインストール
RUN ./app
ローカル環境のファイルをコンテナ内のappディレクトリにコピーする
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
ローカル環境のentrypoint.shをコンテナ内のusr/bin/にコピーし、
chmod +x を使用して実行権限をusr/bin/entrypoint.shに与え、
entrypoint.shに記述したスクリプトを実行
EXPOSE 3000
Port番号を3000に指定
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
アプリケーションサーバーを立ち上げるためのコマンド
entrypoint.shで記述するexec "$@"の$@の部分に渡されることで実行される
/docker-rails-app/docker-compose.yml
version: "3"
services:
web:
build: .
volumes:
- .:/app
command: /bin/sh -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
ports:
- "3000:3000"
depends_on:
- db
tty: true
stdin_open: true
db:
image: postgres
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
webとdbの2つのコンテナを作成する
/docker-rails-app
docker-compose run --no-deps web rails new . --force --api --database=mysql -T --skip-bundle
/docker-rails-app/config/database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILSMAXTHREADS") { 5 } %>
username: postgres
password: password
host: db
username、password、hostを追記
/docker-rails-app
docker-compose up -d --build
このコマンドにより、docker-compose.ymlに記載したコードに沿ってコンテナが立ち上がる。
また、--buildオプションを付けることでDockerfileに記載したコードに沿ってビルドしてくれる。
docker-compose ps
このコマンドでコンテナの状態を確認することができる。
Stateの部分がweb、dbの両方がUpになっていればコンテナが正常に起動していることになる。
docker-compose exec web rails db:create
最初は、データベースが存在しないため、docker-compose exec webでwebコンテナに接続し、RailsのコマンドでDBを作成する。
Webブラウザでhttp://localhost:3000にアクセスし、Railsの初期画面が描写されていれば完了