Alpine Linux ベースの Docker イメージで Rails6.1 + MySQL の環境を作る機会がありました。構築手順を残しておきます。
以前書いた記事の MySQL 版です。必要なパッケージを調査した内容は記事の後半に書いてあることとほぼ同じなので、興味がある方は参照してください。
-
Alpine+Rails6+PostgreSQLのDockerfileを作る
Alpine Linux ベースの Docker イメージで Rails6.1 + PostgreSQL の環境を作る機 ...
続きを見る
目次
- Rails プロジェクトを作成する
- Rails 用の Docker イメージを作る
- ローカル開発用の docker-compose.yml を作る
- DB の設定をする
- データベースの初期化とコンテナの起動
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_ENV
と RAILS_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 です。
必要なパッケージを調査した内容は記事の後半に書いてあることとほぼ同じなので、興味がある方は参照してください。
-
Alpine+Rails6+PostgreSQLのDockerfileを作る
Alpine Linux ベースの Docker イメージで Rails6.1 + PostgreSQL の環境を作る機 ...
続きを見る