Alpine+Rails6+MySQLのDockerfileを作る

2020年12月29日

Rails

Alpine Linux ベースの Docker イメージで Rails6.1 + MySQL の環境を作る機会がありました。構築手順を残しておきます。

以前書いた記事の MySQL 版です。必要なパッケージを調査した内容は記事の後半に書いてあることとほぼ同じなので、興味がある方は参照してください。

Rails
Alpine+Rails6+PostgreSQLのDockerfileを作る

Alpine Linux ベースの Docker イメージで Rails6.1 + PostgreSQL の環境を作る機 ...

続きを見る

目次

  1. Rails プロジェクトを作成する
  2. Rails 用の Docker イメージを作る
  3. ローカル開発用の docker-compose.yml を作る
  4. DB の設定をする
  5. データベースの初期化とコンテナの起動

Rails プロジェクトを作成する

Rails プロジェクトを作成するための Dockerfile を作成します。

FROM ruby:2.7.2-alpine3.12

WORKDIR /myapp

COPY . .

RUN apk update \
    && apk add --no-cache --virtual=.build-deps \
    build-base \
    && apk add --no-cache \
    mariadb-dev \
    tzdata \
    nodejs~=12 \
    yarn

Docker イメージを作成します。

docker build -t rails-installer .

Docker コンテナを起動し、ログインします。

docker run --rm -v $(pwd):/myapp:delegated -ti rails-installer ash

Rails をインストールします。

gem install rails -v "6.1.0"

Rails プロジェクトを作成します。

rails new . -d mysql

これで、ホストマシンに Rails プロジェクトが展開されました。コンテナから抜け、rails-installer イメージを削除しておきます。

docker rmi rails-installer

Rails 用の Docker イメージを作る

Dockerfile と同じディレクトリに entrypoint.sh を作ります。

#!/bin/sh
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 "$@"

Dockerfile を以下のように変更します。

FROM ruby:2.7.2-alpine3.12

ARG RAILS_ENV
ARG RAILS_MASTER_KEY

WORKDIR /myapp

COPY . .

RUN apk update \
    && apk add --no-cache --virtual=.build-deps \
    build-base \
    && apk add --no-cache \
    mariadb-dev \
    tzdata \
    nodejs~=12 \
    yarn \
    && bundle install \
    && yarn install \
    && rails assets:precompile \
    && apk del .build-deps

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

ARG で指定している RAILS_ENVRAILS_MASTER_KEY は CI サーバなどで本番環境用の Docker イメージをビルドするときに使います。

ローカル開発用の docker-compose.yml を作る

docker-compose.yml を作ります。

version: '3'

services:
  app:
    build: .
    command: ash -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
    depends_on:
      - db
    environment:
      - DATABASE_HOST=db
    ports:
      - "3000:3000"
    volumes:
      - .:/myapp:delegated

  db:
    image: mysql:8
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - db:/var/lib/mysql

volumes:
  db:

DB の設定をする

config/database.yml の development と test 環境を編集し DB の接続情報を環境変数から受け取るようにします。

development:
  <<: *default
      database: myapp_development
      host: <%= ENV['DATABASE_HOST'] %>
test:
  <<: *default
      database: myapp_test
      host: <%= ENV['DATABASE_HOST'] %>

データベースの初期化とコンテナの起動

Docker イメージをビルドします。

docker-compose build

データベースを作成します。

docker-compose run --rm app bin/rails db:create

マイグレーションを実行します。

docker-compose run --rm app bin/rails db:migrate

コンテナを起動します。

docker-compose up

ブラウザから http://localhost:3000 にアクセスして、「Yay! You’re on Rails!」が表示されていれば OK です。

必要なパッケージを調査した内容は記事の後半に書いてあることとほぼ同じなので、興味がある方は参照してください。

Rails
Alpine+Rails6+PostgreSQLのDockerfileを作る

Alpine Linux ベースの Docker イメージで Rails6.1 + PostgreSQL の環境を作る機 ...

続きを見る

-技術ブログ
-