はじめに
備忘録です。
特に説明はしません。 全てコピペして最後に載せたコマンドを打ってもらえると
参考にPostgreSQLのパターンがある
--api
を付け加えるとapiモードで開発できる
必要ファイル
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.sh
Dockerfile
FROM ruby:3.1
ARG RUBYGEMS_VERSION=3.3.20
WORKDIR /myapp
COPY Gemfile* /myapp/
RUN gem update --system ${RUBYGEMS_VERSION} && \
bundle install
COPY . /myapp/
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"]
docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0.29
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./tmp/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.3'
Gemfile.lock
# 空
entrypoint.sh
#!/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 "$@"
コマンド順序
# Imageをbuildする
$ docker compose build
# コンテナ内で railsアプリを作成する
# apiモードで作成したい場合は --apiをつける
$ docker compose run --rm web rails new . -f -B -d mysql --skip-test --skip-turbolinks
# config/database.ymlを編集してコンテナのmysqlに接続する
password: root
host: db
# Gemfileが更新されたので再度Imageをbuildする
$ docker compose build
# コンテナを起動させてDBを作成
$ docker compose run --rm web rails db:create
# 最後にwebとdbのサービスを立ち上げる
$ docker compose up -d
tips
# 開発時はコンテナ内部に入っておくと便利
$ docker compose exec web /bin/bash
注意点
注意点
# bundlerのversonの問題でエラーが発生する
# v2.3.8 v2.3.7はx
# versionを固定する
# 環境変数を使わない場合失敗する(理由は不明)
# エラーが出た際は下記を実装してみる
ENV BUNDLER_VERSION=2.3.3
RUN gem install bundler -v ${BUNDLER_VERSION} && \
bundle install
注意点2
docker-hubにログインしていること
既に動いているコンテナとportが被っていないことを確認する