私にはまだDockerなんてものは早いと思ったんですが、rbenvの設定が全然出来ず、「これはDockerでやったほうが早いわ!」と思って作成。
山浦先生のほぼ丸パクリです。よくわかんない人は見るべき。本当に分かりやすかったです。
本番環境には入れない予定。あくまで忘備録です。
先にメモ
Dockerfileとdocker-composeはGemfileとかと同じ位置に配置
Gemfile
sqliteからmysql2へ
Dockerfile
Dockerfile
FROM ruby:2.7
# 追記
ENV RAILS_ENV=production
# 必要なライブラリのNode.jsとyarnをインストールしている
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn
WORKDIR /app
COPY . /app
RUN gem install bundler:1.17.2 && bundle update --bundler
RUN bundle config --local set path 'vendor/bundle' \
&& bundle install
# 以下追記
COPY start.sh /start.sh
RUN chmod 744 /start.sh
CMD ["sh", "/start.sh"]
docker-compose.yml
docker-compose.yml
version: '3'
# 2つのサービス(dbとweb)を定義する
services:
db:
image: mysql:8.0
# mysqlの8.0から認証形式が変わったのでその設定
command: --default-authentication-plugin=mysql_native_password
volumes:
# ローカル:Dockerでsqlのデータを同期する設定
# コンテナを削除してもデータを引継ぎが出来る
- ./db/mysql_data:/var/lib/mysql
# 環境変数の設定
environment:
# mysqlはパスワードが無いとエラーになるので設定
MYSQL_ROOT_PASSWORD: password
# webというサービスがrailsを示している
web:
# 参照先
build: .
# rails s でポートは3000、バインドはどこでもOKと設定
command: bundle exec rails s -p 3000 -b '0.0.0.0'
# 同期設定
volumes:
- .:/app
ports:
- "3000:3000"
# webサービスはdbサービスに"依存"しているという記述
# これを記述するとIPアドレスを指定せずdbと書けば接続出来る
depends_on:
- db
database.yml
config/database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
host: <%= ENV.fetch("APP_DATABASE_HOST") { 'db' } %>
production:
<<: *default
database: <%= ENV['APP_DATABASE'] %>
username: <%= ENV['APP_DATABASE_USERNAME'] %>
password: <%= ENV['APP_DATABASE_PASSWORD'] %>
host: <%= ENV['APP_DATABASE_HOST'] %>
start.sh
start.sh
#! /bin/sh
# Dockerfileで普通はif分岐しないのでシェルスクリプトで対応
if [ "${RAILS_ENV}" = "production" ]
then
bundle exec rails assets:precompile
fi
# PORTの値が無ければ3000を代入する
bundle exec rails s -p ${PORT:-3000} -b 0.0.0.0
.gitignore
.gitignore
# 追記
.env
/db/mysql_data/*
いよいよ開始!
sudoコマンドかdockerグループを作成すべし。
ubuntu(WSL2)
$ docker-compose run web bundle exec rails new . --force --skip-bundle
$ docker-compose build
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
$ docker-compose up -d
localhost:3000に接続して開発環境の設定おわり!いやはや簡単だ~
Containerを閉じる
docker-compose down
でコンテナの活動を止めて、docker system prune -a
で使っていないコンテナを削除。
Dockerのアプリからも出来るからすごいなーと思ってます。
事前準備段階で上手くいかない
- linuxをWSL1からWSL2に変更
- Docker Desktopのアップデート
これが終わってからDocker Desktopの設定変更にとりかかる
Finish!
間違っていたら教えてください!