自己紹介
来年から新卒入社でエンジニアとして働き始める蛇姫と申します。
Ruby on Railsで開発を行った際にDockerを使用したので備忘録として残したいと思います。
初めての記事投稿なので至らないところも多々あるかとは思いますが、何か間違い等ありましたらご指摘のほどよろしくお願いいたします。
背景
システムの開発にあたって最初はWindows上で開発を行っていたのですが、AWSにデプロイする際に、unicornのインストールがWindowsでは行えなかったため、dockerを用いてunicornを利用できる開発環境を用意することにしました。
前提条件
- Docker Desktopがインストール済みであること
- WSLがインストール済みであること
構成情報(2023年12月16日)
- Windows 11 home
- ruby 3.2.2
- Ruby on Rails 7.1.2
- Docker version 24.0.5
- Ubumtu 22.04 LTS
- PostgreSQL 15.4
ファイルの準備
プロジェクトのディレクトリに以下のファイルを用意する。
- Dockerfile
- compose.yaml
- entrypoint.sh
- Gemfile
- Gemfile.lock
各ファイルの中身は以下の通り
#rubyのバージョン
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y postgresql-client
RUN mkdir /apps
WORKDIR /apps
COPY ./Gemfile /apps/Gemfile
COPY ./Gemfile.lock /apps/Gemfile.lock
RUN bundle install
RUN bundle update
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENTRYPOINT [ "entrypoint.sh" ] #entrypoint.shを実行
EXPOSE 3000
CMD [ "rails" ,"server","-b","0.0.0.0" ] #rails serverを起動するコマンド
version: '3.8'
services:
db:
image: postgres
volumes:
- pg_data:/var/lib/postgresql/pg_data
environment:
POSTGRES_USER: dev #ユーザー名
POSTGRES_PASSWORD: dev #パスワード
POSTGRES_DB: dev
web:
build: .
volumes:
- .:/apps
ports:
- "3000:3000"
tty: true
stdin_open: true
depends_on:
- db
working_dir: /apps
volumes:
pg_data:
driver: local
#!/bin/bash
set -e
rm -f /apps/tmp/pids/server.pid
exec "$@"
source "https://rubygems.org"
gem "rails", "~> 7.1.2"
コンテナの作成
上記のファイルを準備したら、コマンドプロンプトで目的のディレクトリに移動し(ここではrailsフォルダ)コマンドを実行する。
cd rails
docker-compose run --rm web rails new . --database=postgresql --skip-docker
上記のコマンドを実行するとrailsのインストールが始まる。
少しすると
conflict Gemfile
Overwrite /apps/Gemfile? (enter "h" for help) [Ynaqdhm]
と表示される。これは作成したGemfileがあるが上書きしてよいかの確認である。
上書きして問題無いので y を入力する。
しばらくするとインストールが完了する。
新たに作成されたGemfileをインストールする。
docker-compose build
このまま起動しても、docker上のDBに接続できないため設定を変更する。
~~略~~
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ host: db #dockerのDBのサービス名
+ username: dev #ユーザー名 (POSTGRES_USER)
+ password: dev #パスワード (POSTGRES_PASSWORD)
~~略~~
production環境のDBを作成する。
docker-compose run --rm web rails db:create
コンテナを立ち上げる
docker-compose up -d
localhost:3000にアクセスして以下の画面が表示されると成功。
停止する場合は以下のコマンド
docker-compose stop
その他Rails操作関連のコマンドメモ
起動してない状態のコンテナで操作を行う
docker-compose run --rm web 実行したいコマンド
docker-compose run --rm web rails g model user
docker-compose run --rm web rails db:migrate
起動中のコンテナで操作を行う
docker-compose exec web 実行したいコマンド
docker-compose exec web rails g class user
新しいgemをインストールする
docker-compose build
おわりに
以上の手順通りに行えばWSLのlinux上で普段と同じ環境で開発が行えると思います。
なにかの参考になればと思います。
AWSへのデプロイについての記事がAmazon linux 2023を利用するとMySQLが無いことでつまづいたことなどもあったのでまた記事にまとめれたらなんて考えています。
拙い記事だったと思いますが、ここまで読んでいただきありがとうございました。